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

时间:2014-09-27 22:23:57

标签: jquery python ajax flask

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

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

现在,每当我通过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!!")
    }});

5 个答案:

答案 0 :(得分:50)

Flask中的

About Responses

  

关于回复

     

视图函数的返回值会自动转换为响应对象。如果返回值是一个字符串,则将其转换为响应对象,并将字符串作为响应正文,200 OK状态代码和text/html mimetype。 Flask应用于将返回值转换为响应对象的逻辑如下:

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

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

return json.dumps({'success':True}), 200, {'ContentType':'application/json'} 

答案 1 :(得分:12)

作为aabilio's answer的选项,您可以使用Flask中的jsonify方法,该方法会自动设置Content-Type:

from flask import jsonify

resp = jsonify(success=True)
return resp

您可以(可选)明确设置响应代码:

resp.status_code = 200

答案 2 :(得分:1)

您还可以将 response_class 与 json 转储一起使用。检查以下示例:

from flask import Flask
from flask import json

app = Flask(__name__)

@app.route(/info)
def getInfo():
    response = app.response_class(
            response=json.dumps({"status":"success","code":0,"data":{"Name":"Eyong","Age":30}}),
            status=200,
            mimetype='application/json'
    )
    return response

答案 3 :(得分:0)

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

from flask import jsonify, make_response

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

此外,这种方法还会自动将Content-Type标头设置为application/json

答案 4 :(得分:0)

使用jsonify返回响应时,只需将status_code添加为return的第二个参数即可。我在此admin_required装饰器中使用了jsonify和401未经授权的HTTP代码。示例:

return jsonify({'error': 'Admin access is required'}), 401

完整示例:

def admin_required(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        if current_user and hasattr(current_user, 'user_type') and current_user.user_type == 'admin':
            return f(*args, **kwargs)
        else:
            if '/api/' in request.url_rule.rule:
                return jsonify({'error': 'Admin access is required'}), 401

            flash(_('Admin access required'))
            return redirect(url_for('main.public_index'))

    return decorated