我正在尝试从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>
Validator适用于这种情况,当没有选择文件时,但是一旦我选择了文件,它就会在该检查中失败。我可以尝试访问filename
,而不仅仅是data
(field.data.filename
),它可以正常工作,但只有在实际选择了文件时才能正常工作。如果未选择任何文件,则会因AttributeError: 'bytes' object has no attribute 'value'
而失败。这是可以理解的。
可能是因为我使用的是python3吗?我该如何解决这个问题?
谢谢,
Rapolas
答案 0 :(得分:2)
首先,您应该检查是否选择了文件:
if type(form.cover_pic.data) is not UnicodeType:
此外,使用strip方法而不是split:
时出错ext = os.path.splitext(filename)[1].strip(".")