我正在尝试验证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,而不仅仅是data (field.data.filename),它工作得很好,但前提是实际选择了一个文件。如果未选择任何文件,则会失败,并返回AttributeError: 'bytes' object has no attribute 'value'。所以这是可以理解的。
会不会是因为我使用的是python3?我该如何解决这个问题?
谢谢,
拉波拉斯
发布于 2014-01-04 05:46:03
首先,您应该检查是否选择了某个文件:
if type(form.cover_pic.data) is not UnicodeType:此外,使用strip方法而不是split方法也会出现错误:
ext = os.path.splitext(filename)[1].strip(".")https://stackoverflow.com/questions/20872900
复制相似问题