Flask,如何返回ajax调用的成功状态代码

yay*_*ayu 49 python ajax jquery flask

在服务器端,我只是将json-as-dictionary打印到控制台

@app.route('/',methods=['GET','POST'])
@login_required
def index():
    if request.method == "POST":
        print request.json.keys()
    return "hello world"
Run Code Online (Sandbox Code Playgroud)

现在,每当我通过ajax发出一个帖子请求时,控制台都会打印出包含我需要的内容的字典.

在客户端,我一直在尝试使用各种方法基于成功的ajax调用执行一些jquery.我刚刚意识到这可能是我服务器端的错误,即我没有发送任何请求标头告诉jquery它的ajax调用是成功的.

那么如何向我的客户发送OK状态告诉它一切正常呢?

为了完整起见,这是我的客户端代码

$.ajax({
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify(myData),
    dataType: 'json',
    url: '/',
    success: function () {
        console.log("This is never getting printed!!")
    }});
Run Code Online (Sandbox Code Playgroud)

小智 58

关于 Flask中的回应:

关于回应

视图函数的返回值会自动转换为响应对象.如果返回值是一个字符串,则将其转换为响应对象,其中字符串为响应主体,200 OK状态代码和text/htmlmimetype.Flask应用于将返回值转换为响应对象的逻辑如下:

  1. 如果返回了正确类型的响应对象,则直接从视图返回.
  2. 如果是字符串,则使用该数据和默认参数创建响应对象.
  3. 如果返回元组,则元组中的项可以提供额外信息.这样的元组必须是这样的形式,(response, status, headers)或者(response, headers)至少有一个项必须在元组中.该status值将覆盖状态代码,headers可以是其他标头值的列表或字典.
  4. 如果这些都不起作用,Flask将假定返回值是一个有效的WSGI应用程序并将其转换为响应对象.

因此,如果您返回文本字符串(正如您所做的那样),您的AJAX调用必须接收的状态代码是200 OK,并且您的成功回调必须正在执行.但是,我建议您返回JSON格式的响应,如:

return json.dumps({'success':True}), 200, {'ContentType':'application/json'} 
Run Code Online (Sandbox Code Playgroud)


Phi*_*röm 18

作为aabilio答案的一个选项,您可以在Flask中使用jsonify方法自动设置Content-Type:

from flask import jsonify

resp = jsonify(success=True)
return resp
Run Code Online (Sandbox Code Playgroud)

您可以(可选)显式设置响应代码:

resp.status_code = 200
Run Code Online (Sandbox Code Playgroud)


sey*_*ulu 8

除了已经发布的答案之外,我发现使用make_responseFlask 中的方法(从 0.6 版开始)是一个更清晰的选择,尤其是当您需要使用 Flask 的 API 响应 JSON 返回状态代码时:

from flask import jsonify, make_response

# ... other code ...
data = {'message': 'Created', 'code': 'SUCCESS'}
return make_response(jsonify(data), 201)
Run Code Online (Sandbox Code Playgroud)

此外,此方法允许您传递响应代码 (201) 并将自动将Content-Type标头设置为application/json.


The*_*mis 7

在较新版本的 Flask 中,它现在将为您处理响应中的转换。您的响应可以简化为返回字典和响应代码,如下所示:

@app.route("/my_route")
def my_route():
    data = {"status": "success", "some key", "some value"}
    return data, 200
Run Code Online (Sandbox Code Playgroud)

data也不一定需要是字典,您也可以传入字符串!