首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >烧瓶-WTF 'FileField‘对象没有属性'has_file’

烧瓶-WTF 'FileField‘对象没有属性'has_file’
EN

Stack Overflow用户
提问于 2019-08-29 02:46:09
回答 1查看 2.3K关注 0票数 1

我结合瓶-WTF烧瓶-上传来处理我的应用程序上的文件上传。

我的包版本是:

代码语言:javascript
复制
Flask-Uploads==0.2.1
Flask-WTF==0.11
WTForms==2.1

下面是我的代码片段:

forms.py

代码语言:javascript
复制
from flask_wtf import Form
from flask_wtf.file import FileAllowed, FileRequired
from wtforms.fields import (StringField, SubmitField, FileField)
from wtforms.validators import InputRequired, Length
from app import photos

class AddCourseForm(Form):
    name = StringField('Course name', validators=[InputRequired(), Length(1, 100)])
    image = FileField('image', validators=[FileRequired(), FileAllowed(photos, 'Images only!')])
    submit = SubmitField('Add course')

下面是上传代码的片段:

代码语言:javascript
复制
@operator.route('/add-course', methods=['GET', 'POST'])
def add_course():
    form = AddCourseForm()
    if form.validate_on_submit():
        course_name = form.name.data
        filename = photos.save(request.files['image'], name="courses/" + course_name + "_course.")
        course = Course(name=course_name, image=filename)
        db.session.add(course)
        db.session.commit()
        flash('Successfully added {} '.format(course.course_name()) + 'course', 'success')
        return redirect(url_for('operator.courses'))
    return render_template('main/operator/add_course.html', form=form)

但是,当我提交时,我得到了以下错误:

代码语言:javascript
复制
AttributeError: 'FileField' object has no attribute 'has_file'

然后,我试图跟踪这个文档,不需要通过直接传递扩展来上传:

代码语言:javascript
复制
image = FileField('image', validators=[FileRequired(), FileAllowed(['jpg', 'png'], 'Images only!')])

但我还是犯了同样的错误。

我的密码怎么了..?如有任何帮助,敬请:)

EN

回答 1

Stack Overflow用户

发布于 2019-08-30 10:35:07

从wtform库导入FileField

代码语言:javascript
复制
from wtforms.fields import (StringField, SubmitField, FileField)

..。但是FileField.has_file()方法是特定于Flask-WTF的。

您需要将FileField添加到来自flask_wtf.file的其他导入中。

您可以访问Flask-WTF.file.FileField 这里的API文档。

当前的实现(在这里发现的)是:

代码语言:javascript
复制
class FileField(_FileField):
    """Werkzeug-aware subclass of :class:`wtforms.fields.FileField`."""

    def process_formdata(self, valuelist):
        valuelist = (x for x in valuelist if isinstance(x, FileStorage) and x)
        data = next(valuelist, None)

        if data is not None:
            self.data = data
        else:
            self.raw_data = ()

    def has_file(self):
        """Return ``True`` if ``self.data`` is a
        :class:`~werkzeug.datastructures.FileStorage` object.
        .. deprecated:: 0.14.1
            ``data`` is no longer set if the input is not a non-empty
            ``FileStorage``. Check ``form.data is not None`` instead.
        """

        warnings.warn(FlaskWTFDeprecationWarning(
            '"has_file" is deprecated and will be removed in 1.0. The data is '
            'checked during processing instead.'
        ))
        return bool(self.data)

如您所见,该类继承自标准wtform实现(在模块中名为_FileField ),但将其扩展为覆盖process_formdata()方法并添加has_file()方法。

还请注意,它们正在贬低该方法,并建议您只检查字段的data属性--这并不完全是一种技术实现,因此您可以做他们所做的事情来获得相同的功能:bool(field.data)

作为参考,下面是wtform FileField实现:

代码语言:javascript
复制
class FileField(Field):
    """Renders a file upload field.
    By default, the value will be the filename sent in the form data.
    WTForms **does not** deal with frameworks' file handling capabilities.
    A WTForms extension for a framework may replace the filename value
    with an object representing the uploaded data.
    """

    widget = widgets.FileInput()

    def _value(self):
        # browser ignores value of file input for security
        return False

...which显示,除了在基类Field类上定义的方法之外,它没有任何方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57702313

复制
相关文章

相似问题

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