这是用于生成文件上传表单并对其进行处理的视图功能(是的,它直接来自Flask docs):
transaction_blueprint = Blueprint(
"transaction", __name__, template_folder="../templates", url_prefix="/transactions"
)
@transaction_blueprint.route("/upload", methods=["GET", "POST"])
def upload_select_file():
print(request.method)
if request.method == "POST":
# check if the post request has the file part
if "file" not in request.files:
flash("No file part")
return redirect(request.url)
file = request.files.get("file")
# if user does not select file, browser also
# submit an empty part without filename
if file.filename == "":
flash("No selected file")
return redirect(request.url)
# allowed_file is defined elsewhere
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join("/tmp", filename))
return jsonify({"success": True})
return """
<!doctype html>
<title>Upload new File</title>
<h1>Upload new File</h1>
<form method=post enctype=multipart/form-data>
<input type=file name=file>
<input type=submit value=Upload>
</form>
<p>%s</p>
""" % "<br>".join(os.listdir("/tmp",))
从http://localhost:8000/transactions/upload
提交表单后,我收到400错误的请求错误。我正在使用一个大约15kb的简单文本文件进行测试。据我所知,HTML格式正确:
<form method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="Upload">
</form>
我搜索了两天,得知当在Flask视图端点中找不到文件输入的name
属性时,会发生此错误。我使用request.files.get("file")
处理。此外,在我的情况下,提交表单后,方法仍未到达(服务器日志甚至未打印“ POST
”)。这是有道理的,因为400是客户端错误,但仍然...
使用蓝图是否有东西打破了这个问题?我在这里做什么错了?
答案 0 :(得分:0)
添加csrf令牌即可完成
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>