Python 烧瓶WTF';文件字段';对象没有属性';具有"u文件';

Python 烧瓶WTF';文件字段';对象没有属性';具有"u文件';,python,flask,flask-wtforms,wtforms,flask-uploads,Python,Flask,Flask Wtforms,Wtforms,Flask Uploads,我将Flask-WTF和Flask-upload结合起来,在我的应用程序上处理文件上传 我的软件包版本是: Flask-Uploads==0.2.1 Flask-WTF==0.11 WTForms==2.1 以下是我的代码片段: forms.py from flask_wtf import Form from flask_wtf.file import FileAllowed, FileRequired from wtforms.fields import (StringField, Subm

我将Flask-WTFFlask-upload结合起来,在我的应用程序上处理文件上传

我的软件包版本是:

Flask-Uploads==0.2.1
Flask-WTF==0.11
WTForms==2.1
以下是我的代码片段:

forms.py

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')
下面是上传代码的片段:

@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)
但是,当我提交时,我得到了以下错误:

AttributeError: 'FileField' object has no attribute 'has_file'
然后,我尝试通过直接传递扩展来遵循这一点,而不进行Flask上载:

image = FileField('image', validators=[FileRequired(), FileAllowed(['jpg', 'png'], 'Images only!')])
但我还是犯了同样的错误

那么,我的代码有什么问题。。?
请提供帮助:)

您从wtforms库导入
文件字段

从wtforms.fields导入(StringField、SubmitField、FileField)
。。。但是
FileField.has\u file()
方法特定于
Flask WTF

您需要将
FileField
添加到来自
flask\u wtf.file
的其他导入中

您可以访问
Flask WTF.file.FileField
的API文档

当前实现()是:

类文件字段(\u文件字段):
“”“Werkzeug-aware的子类:类:`wtforms.fields.FileField`.”
def过程表单数据(自身、值列表):
valuelist=(如果是Instance(x,文件存储)和x,则valuelist中的x代表x)
数据=下一个(值列表,无)
如果数据不是无:
self.data=数据
其他:
self.raw_data=()
def具有_文件(自身):
如果“self.data”是
:类:`~werkzeug.datastructures.FileStorage`对象。
…已弃用::0.14.1
``如果输入不是非空的,则不再设置数据“”
``文件存储“`。请检查“form.data不是None`”。
"""
警告。警告(烧瓶)警告(
“'has_file'已弃用,将在1.0中删除。数据为”
'改为在处理过程中检查。'
))
返回布尔值(自身数据)
如您所见,该类继承自标准wtforms实现(在模块中名为
\u FileField
),但对其进行了扩展,以覆盖
进程\u formdata()
方法,并添加
has\u file()
方法

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

以下是wtforms
文件字段
实现,仅供参考:

类文件字段(字段):
“”“呈现文件上载字段。
默认情况下,该值将是表单数据中发送的文件名。
WTForms**不**处理框架的文件处理功能。
框架的WTForms扩展可以替换文件名值
使用表示上载数据的对象。
"""
widget=widgets.FileInput()
def_值(自身):
#为了安全起见,浏览器忽略文件输入的值
返回错误

…这表明除了在基本
字段
类上定义的方法之外,它没有任何方法。

您可以从wtforms库导入
文件字段

从wtforms.fields导入(StringField、SubmitField、FileField)
。。。但是
FileField.has\u file()
方法特定于
Flask WTF

您需要将
FileField
添加到来自
flask\u wtf.file
的其他导入中

您可以访问
Flask WTF.file.FileField
的API文档

当前实现()是:

类文件字段(\u文件字段):
“”“Werkzeug-aware的子类:类:`wtforms.fields.FileField`.”
def过程表单数据(自身、值列表):
valuelist=(如果是Instance(x,文件存储)和x,则valuelist中的x代表x)
数据=下一个(值列表,无)
如果数据不是无:
self.data=数据
其他:
self.raw_data=()
def具有_文件(自身):
如果“self.data”是
:类:`~werkzeug.datastructures.FileStorage`对象。
…已弃用::0.14.1
``如果输入不是非空的,则不再设置数据“”
``文件存储“`。请检查“form.data不是None`”。
"""
警告。警告(烧瓶)警告(
“'has_file'已弃用,将在1.0中删除。数据为”
'改为在处理过程中检查。'
))
返回布尔值(自身数据)
如您所见,该类继承自标准wtforms实现(在模块中名为
\u FileField
),但对其进行了扩展,以覆盖
进程\u formdata()
方法,并添加
has\u file()
方法

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

以下是wtforms
文件字段
实现,仅供参考:

类文件字段(字段):
“”“呈现文件上载字段。
默认情况下,该值将是表单数据中发送的文件名。
WTForms**不**处理框架的文件处理功能。
框架的WTForms扩展可以替换文件名值
使用表示上载数据的对象。
"""
widget=widgets.FileInput()
def_值(自身):
#为了安全起见,浏览器忽略文件输入的值
返回错误
…这表明除了在基本
字段
类中定义的方法之外,它没有其他方法