MultiFileField 没有 Return 文件,returns _str_
MultiFileField Doesn't Return Files, returns _str_
我正在尝试使用“MultiFileField”在 Flask 中使用 WTForms 上传多张图片,但是,它 returns 是一个字符串而不是文件对象。
所以我尝试使用以下内容:
request.files.getlist(form.upload_field.data)
但它 returns 是一个空列表,所以无论如何我都可以处理这个以将照片保存到目录中
有使用 Flask 上传文件的文档 here,您将通过访问 request.files
对象以正确的方式进行操作。我遇到了两种从那里获取空列表的方法:
1. enctype
表单 html 属性未设置
这是呈现 MultipleFileField()
:
的示例模板
template = """
<form action="" method="POST" enctype="multipart/form-data">
{{ form.upload_field() }}
{{ form.submit() }}
</form>
"""
如果我删除 enctype=...
部分,文件列表 returns 为空,否则它会有值。 page on the internet 说:
This value is required when you are using forms that have a file upload control
2。将错误的密钥传递给 request.files.getlist()
request.files
是一个 werkzeug.MultiDict
,它是键到值的映射,旨在处理同一键的多个值。
使用与上面相同的表单模板,在 POST 上检查 request.files
(print(list(request.files.keys()))
) 的键显示 ['upload_field']
.
werkzeug.MultiDict.getlist
有一个 必需的 参数:
key - The key to be looked up.
所以此时 MultiDict 实例中唯一的键是字符串 'upload_field'
,如果我们想从 getlist
方法中取回任何东西,这需要是我们传递的键至 getlist
。在您的示例代码中,您传递了 form.upload_field.data
属性的值(在我的测试中为 None
)。将其更改为 'upload_field'
,您应该离开。
这是一个最小的工作示例,它将在表单提交时打印调用 request.files.getlist()
的结果。 运行 脚本,在浏览器中访问 http://127.0.0.1:5000
,上传几个文件并观察终端输出。
from flask import Flask, render_template_string, request
from wtforms import Form, MultipleFileField, SubmitField
app = Flask(__name__)
class MyForm(Form):
upload_field = MultipleFileField()
submit = SubmitField()
template = """
<form action="" method="POST" enctype="multipart/form-data">
{{ form.upload_field() }}
{{ form.submit() }}
</form>
"""
@app.route("/", methods=["GET", "POST"])
def route():
form = MyForm()
if request.method == "POST":
print(request.files.getlist("upload_field"))
return render_template_string(template, form=form)
if __name__ == "__main__":
app.run(debug=True)
我正在尝试使用“MultiFileField”在 Flask 中使用 WTForms 上传多张图片,但是,它 returns 是一个字符串而不是文件对象。 所以我尝试使用以下内容:
request.files.getlist(form.upload_field.data)
但它 returns 是一个空列表,所以无论如何我都可以处理这个以将照片保存到目录中
有使用 Flask 上传文件的文档 here,您将通过访问 request.files
对象以正确的方式进行操作。我遇到了两种从那里获取空列表的方法:
1. enctype
表单 html 属性未设置
这是呈现 MultipleFileField()
:
template = """
<form action="" method="POST" enctype="multipart/form-data">
{{ form.upload_field() }}
{{ form.submit() }}
</form>
"""
如果我删除 enctype=...
部分,文件列表 returns 为空,否则它会有值。 page on the internet 说:
This value is required when you are using forms that have a file upload control
2。将错误的密钥传递给 request.files.getlist()
request.files
是一个 werkzeug.MultiDict
,它是键到值的映射,旨在处理同一键的多个值。
使用与上面相同的表单模板,在 POST 上检查 request.files
(print(list(request.files.keys()))
) 的键显示 ['upload_field']
.
werkzeug.MultiDict.getlist
有一个 必需的 参数:
key - The key to be looked up.
所以此时 MultiDict 实例中唯一的键是字符串 'upload_field'
,如果我们想从 getlist
方法中取回任何东西,这需要是我们传递的键至 getlist
。在您的示例代码中,您传递了 form.upload_field.data
属性的值(在我的测试中为 None
)。将其更改为 'upload_field'
,您应该离开。
这是一个最小的工作示例,它将在表单提交时打印调用 request.files.getlist()
的结果。 运行 脚本,在浏览器中访问 http://127.0.0.1:5000
,上传几个文件并观察终端输出。
from flask import Flask, render_template_string, request
from wtforms import Form, MultipleFileField, SubmitField
app = Flask(__name__)
class MyForm(Form):
upload_field = MultipleFileField()
submit = SubmitField()
template = """
<form action="" method="POST" enctype="multipart/form-data">
{{ form.upload_field() }}
{{ form.submit() }}
</form>
"""
@app.route("/", methods=["GET", "POST"])
def route():
form = MyForm()
if request.method == "POST":
print(request.files.getlist("upload_field"))
return render_template_string(template, form=form)
if __name__ == "__main__":
app.run(debug=True)