【问题标题】:Validating FileField using wtforms使用 wtforms 验证 FileField
【发布时间】:2014-01-01 20:25:18
【问题描述】:

I'm trying to validate FileField field from wtforms, however, I get the following exception, when file is selected:

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吗?我该如何解决这个问题?

谢谢,
拉波拉斯

【问题讨论】:

标签: python-3.x pyramid wtforms


【解决方案1】:

首先,你应该检查一个文件是否被选中:

if type(form.cover_pic.data) is not UnicodeType:

另外,使用 strip 方法而不是 split 时会出错:

ext = os.path.splitext(filename)[1].strip(".")

【讨论】:

    猜你喜欢
    • 2014-02-05
    • 1970-01-01
    • 2020-03-03
    • 2019-04-02
    • 2018-09-12
    • 2013-11-22
    • 1970-01-01
    • 2019-05-10
    • 2021-08-09
    相关资源
    最近更新 更多