如何在 Flask 中接受通过 ajax 发送的 FormData?

Posted

技术标签:

【中文标题】如何在 Flask 中接受通过 ajax 发送的 FormData?【英文标题】:How to accept FormData sent via ajax in Flask? 【发布时间】:2017-02-26 18:02:50 【问题描述】:

我正在尝试使用 Ajax POST 请求在 FormData 中发送图像文件。 我面临两个问题:

    不知道怎么提取烧瓶部分的FormData 发出 ajax POST 请求时出现 500 内部服务器错误(不确定这是不是因为 1)

谢谢

烧瓶python代码:

@app.route('/', methods=['GET','POST'])
def upload_file():
if request.method == 'POST':
    file = request.files['file']
    if file: # and allowed_file(file.filename):
        filename = secure_filename(file.filename)
        file.save(os.path.join(os.getcwd()+"/static", "current_image.jpg"))
        return jsonify('tasks': tasks)

htmljavascript 代码:

<input id="pictureInput" type=file name=file>
<input type=submit value=Upload id="button">

<script type="text/javascript">
var pictureInput = document.getElementById("pictureInput");
var myFormData = new FormData();
myFormData.append('pictureFile', pictureInput.files[0]);

$("#button").click(function()
    console.log(pictureInput);
    console.log(pictureInput.files[0]);
    console.log(myFormData);

    $.ajax(
      url: "http://localhost:8000/",
      type: 'POST',
      processData: false, // important
      contentType: false, // important
      dataType : 'json',
      data: myFormData,
      success : function(data)
            console.log(data);
      ,
    );
);
</script>

错误:

【问题讨论】:

添加那个 500 响应的 content 是什么?实际错误是什么? 对不起丹尼尔,我明白你的意思。我添加了使用 POSTMAN 得到的错误响应。 嗯,这与您最初显示的代码不同;错误发生在sys.stdout.write 很抱歉。我试图调试它。现在,当使用原始代码时,我收到“错误请求 - 浏览器(或代理)发送了一个此服务器无法理解的请求。” 面临同样的问题。无法访问 Flask 中的 FormData。如果有人有解决方案,请告诉我。 【参考方案1】:

1.我不知道如何提取烧瓶部分的FormData

为了提取fomrdata,您可以编写以下代码

@app.route('/', methods=['GET','POST'])
def upload_file():
if request.method == 'POST':
    file = request.files['pictureFile'] # according to the name you append to formdata

2。发出 ajax POST 请求时出现 500 内部服务器错误(不确定这是不是因为 1)

实际上,如果找不到该文件,则没有正确的响应,因此将无法正常工作。

您可以参考以下示例代码

@app.route('/', methods=['GET','POST'])
def upload_file():
if request.method == 'POST':
    isSuccess = False
    if 'file' not in request.files:
         return jsonify("IsSuccess" : isSuccess, "Message": "No file part")

    file = request.files['pictureFile'] # according to the name you append to formdata

    if file: # and allowed_file(file.filename):
        filename = secure_filename(file.filename)
        file.save(os.path.join(os.getcwd(), "static", "current_image.jpg"))

        isSuccess = True
        tasks = [] 
        return jsonify("IsSuccess" : isSuccess, "tasks": tasks)

 return jsonify("IsSuccess" : isSuccess, "Message": "Error occurs")

【讨论】:

【参考方案2】:

以下代码应该适合您。 您需要将static 文件夹与您的app.py 文件放在同一级别

app.py

import os
from flask import Flask, request, jsonify
from werkzeug.utils import secure_filename

app = Flask(__name__)


@app.route('/', methods=['GET','POST'])
def upload_file():
    if request.method == 'POST':
        file = request.files['file']
        if file:
            filename = secure_filename(file.filename)
            file.save(os.path.join(os.getcwd()+"/static", "current_image.jpg"))
            tasks = []
            return jsonify('tasks': tasks)


if __name__ == "__main__":
    app.run(host='0.0.0.0', debug=True)

tasks 没有在上面的代码中定义,所以我只是将它初始化为一个空列表。您还需要确保 jQuery 已加载到您的模板中。

【讨论】:

嗨@ettanany 我正在关注同样的例子,但如果我尝试print(request.files) 我得到ImmutableMultiDict([]).. 知道为什么会这样吗?谢谢 @ettanany file = request.files['file'] 这段代码不起作用,因为请求中没有文件对象,有一个文件是其中一部分的FormData 对象。 这不是他在问题中要问的。

以上是关于如何在 Flask 中接受通过 ajax 发送的 FormData?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 AJAX 使用 Flask-WTForms CSRF 保护?

Flask04 后台获取请求数据视图函数返回类型前台接受响应数据

如何在 Python 的 Flask 中识别通过 AJAX 发出的请求?

AJAX 向 Python Flask 发布请求 [重复]

Flask框架:如何运用Ajax轮询动态绘图

ajax传递json,然后服务器接受json的代码编写