使用wtforms验证FileField

4

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

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")

验证器代码和表单本身:

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表单:

<form method="POST" action="save" enctype="multipart/form-data">
  {{ form.title }}
  {{ form.content }}
  {{ form.cover_pic }}
  <input type="submit" value="Save" />
</form>

验证器适用于未选择文件的情况,但是一旦我选择了文件,它就在那个检查上失败了。我可以尝试访问filename,而不仅仅是datafield.data.filename),这样做很好,但前提是必须选择一个文件。如果没有选择文件,则会出现AttributeError: 'bytes' object has no attribute 'value'。所以这很容易理解。

这是否是因为我使用的是Python3?我该如何解决这个问题?

谢谢,
Rapolas


你是否联系过 WTForms 的开发人员?这可能与将该库移植到 py3k 有关的错误。 - nsfyn55
你可能也想查看这个链接http://www.diveintopython3.net/special-method-names.html#acts-like-set,它描述了`cgi.py`的这一部分。 - nsfyn55
1个回答

2
首先,您应该检查是否选择了文件:
if type(form.cover_pic.data) is not UnicodeType:

此外,您在使用strip方法时出现了错误,应该使用split方法:
ext = os.path.splitext(filename)[1].strip(".")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接