烧瓶,如何返回一个 Ajax 调用的成功状态代码

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

关于 Flask 中的响应 :

关于回应

视图函数的返回值将自动转换为响应对象。如果返回值是一个字符串,那么它将转换成一个响应对象,其中字符串作为响应体、 200 OK状态码和 text/html模拟类型。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'}

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

from flask import jsonify


resp = jsonify(success=True)
return resp

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

resp.status_code = 200

除了已经发布的答案,我发现在 Flask 中使用 make_response方法(来自0.6版本)是一个更清晰的选择,特别是当你需要返回状态代码和 Flask API 的响应 JSON:

from flask import Flask, jsonify, make_response


app = Flask(__name__)




@app.route('/do_thing')
def do_thing():
# ... other code ...
data = {'message': 'Done', 'code': 'SUCCESS'}
return make_response(jsonify(data), 201)


if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)

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

当使用 jsonify返回响应时,只需添加 status_code作为 return的第二个参数。我已经使用 jsonify和401未经授权的 HTTP 代码在这个 admin _ 义务的装饰器中。例如:

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

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


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

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

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