首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用wtforms验证FileField

使用wtforms验证FileField
EN

Stack Overflow用户
提问于 2014-01-02 04:25:19
回答 1查看 2.5K关注 0票数 3

我正在尝试验证wtforms中的FileField字段,但是,当文件被选中时,我得到了以下异常:

代码语言:javascript
复制
File "forms.py", line 15, in check_cover # my forms.py file with custom validator
  if field.data:
File "/usr/lib/python3.3/cgi.py", line 637, in __len__
  return len(self.keys())
File "/usr/lib/python3.3/cgi.py", line 626, in keys
  raise TypeError("not indexable")

验证器代码和表单本身:

代码语言:javascript
复制
def check_cover(form, field):
  if field.data: # this line raises exception
    filename = field.data.filename
    ext = os.path.splitext(filename)[1].strip(".")
    if not ext.lower() in ALLOWED_IMG_EXT:
        raise validators.ValidationError('Has to be an image')
  else:
    raise validators.ValidationError('Please, provide an image')

class BlogPostForm(Form):
  title = TextField('Title',
                    validators=[validators.Length(min=1, max=200)])
  content = TextAreaField('Content', [validators.Length(min=1)],
                          id='blog-content')
  cover_pic = FileField('Cover image', validators=[check_cover])

和html表单:

代码语言:javascript
复制
<form method="POST" action="save" enctype="multipart/form-data">
  {{ form.title }}
  {{ form.content }}
  {{ form.cover_pic }}
  <input type="submit" value="Save" />
</form>

验证器适用于这种情况,当未选择文件时,但只要我选择了一个文件,它就会在检查中失败。我可以尝试访问filename,而不仅仅是data (field.data.filename),它工作得很好,但前提是实际选择了一个文件。如果未选择任何文件,则会失败,并返回AttributeError: 'bytes' object has no attribute 'value'。所以这是可以理解的。

会不会是因为我使用的是python3?我该如何解决这个问题?

谢谢,

拉波拉斯

EN

回答 1

Stack Overflow用户

发布于 2014-01-04 05:46:03

首先,您应该检查是否选择了某个文件:

代码语言:javascript
复制
if type(form.cover_pic.data) is not UnicodeType:

此外,使用strip方法而不是split方法也会出现错误:

代码语言:javascript
复制
ext = os.path.splitext(filename)[1].strip(".")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20872900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档