python - 为什么flask_wtf.FlaskForm 上传文件会报错,说文件没有上传?
问题描述
编辑
如果我打电话request.files['file']
,我会得到文件对象,但form.validate_on_submit()
仍然失败。如果文件对象在请求中,为什么会失败?
我有三个文件:
表格.py
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileRequired
class ExcelForm(FlaskForm):
excel_file = FileField(validators=[
FileRequired()
])
webapp.py
from flask import Flask, render_template, redirect, url_for, request
from forms import ExcelForm
import pandas as pd
app = Flask(__name__)
app.config['SECRET_KEY'] = '314159265358'
@app.route('/', methods=['GET', 'POST'])
def upload():
form = ExcelForm(request.form)
if request.method == 'POST' and form.validate_on_submit():
df = pd.read_csv(form.excel_file.data)
print(df.head())
return redirect(url_for('hello', name=form.excel_file.data))
return render_template('upload.html', form=form)
@app.route('/hello/<name>')
def hello(name):
return 'hello' + name
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)
模板\上传.html
{% extends "layout.html" %}
{% block content %}
<form method = "POST" enctype = "multipart/form-data">
{{ form.hidden_tag() }}
<input type = "file" name = "file" />
<input type = "submit"/>
</form>
{% endblock content %}
我可以毫无问题地访问localhost:5000/upload
。我单击浏览按钮,选择我的文件,然后单击提交按钮。
在webapp.py
upload
函数中,form.validate_on_submit()
失败并给我一个错误说{'excel_file': ['This field is required.']}
。有人可以告诉我我做错了什么吗?
我不想将文件保存在本地以便以后读取。
解决方案
您需要按照flask-wtforms指定的方式呈现表单字段。
实际上是从他们的文档中复制的...
{% extends "layout.html" %}
{% from "_formhelpers.html" import render_field %}
{% block content %}
<form method = "POST" enctype = "multipart/form-data">
{{ form.hidden_tag() }}
{{ render_field(form.file) }}
{{ render_field(form.submit) }} <!-- add a submit button to your form -->
</form>
{% endblock content %}
然后创建宏
_formhelpers.html
{% macro render_field(field) %}
<dt>{{ field.label }}
<dd>{{ field(**kwargs)|safe }}
{% if field.errors %}
<ul class=errors>
{% for error in field.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
</dd>
{% endmacro %}
推荐阅读
- c# - 如何从 InternetExplorer 对象中获取 HWND
- java - 有没有办法一次将流分成2个列表?
- c - 我没有得到输出,我假设
- ruby-on-rails - 在 Amazon Linux 2 上部署 Rails 应用程序时构建失败
- c# - Unity C# Singleton + non-singleton 类都扩展为同一个父类
- vscode-debugger - 无法在 VS 代码 FileNotFoundError webview-panel/webview-785a0700-b311-4a50-aed3-34596b5792f6 中调试 python
- javascript - 如何访问作为js Map中对象的键的值
- visual-studio - 快速查找不记得正则表达式
- arrays - 展开运算符 redorders 数组按字母顺序排列
- python - 在 Python Pandas 中将对象更改为浮点数或数字