【问题标题】:Flask, how to return a success status code for ajax callFlask,如何为ajax调用返回成功状态码
【发布时间】:2014-11-22 15:45:53
【问题描述】:

在服务器端,我只是将 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!!")
    }});

【问题讨论】:

  • 您是否尝试过返回有效的 JSON 字符串而不是纯文本 hello world?您指定返回数据类型为 json,但 jquery 可能无法解码“hello world”,因此永远不会调用成功函数。
  • @PeterGibson 在 GET 请求中返回“hello world”。我没有在 POST 上返回任何内容。
  • @PeterGibson 这确实是问题所在。我放了一个return 'OK',它现在可以工作了。如果您愿意,可以提交答案。
  • 哦,对了,对不起 - 仍然没有返回值,Python 默认返回 None,这不是一个有效的 JSON 对象。尝试返回类似'{"hello": "world"}'
  • 好的太好了 :) 我现在看到 dataType 可能是用于发布数据的。

标签: jquery python ajax flask


【解决方案1】:

About Responses 在烧瓶中:

关于回复

视图函数的返回值会自动为您转换为响应对象。如果返回值是一个字符串,它会被转换成一个响应对象,该字符串作为响应主体,一个200 OK 状态码和一个text/html mimetype。 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'} 

【讨论】:

    【解决方案2】:

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

    from flask import jsonify
    
    resp = jsonify(success=True)
    return resp
    

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

    resp.status_code = 200
    

    【讨论】:

    • 甚至更简单:return {}
    【解决方案3】:

    除了已经发布的答案之外,我发现在 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)
    

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

    【讨论】:

      【解决方案4】:

      当使用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
      

      【讨论】:

        【解决方案5】:

        您还可以将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
        
        

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-09-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-11-09
            • 2011-11-27
            相关资源
            最近更新 更多