一个视图函数的返回值会被自动转换为一个响应对象response。如果返回值是一个字符串,它被转换成一个响应,并且响应主体是该字符串,响应代码代码为 200 OK ,媒体类型为 text/html 的响应对象。如果返回值是一个字典,那么会调用jsonify()创建响应对象。 Flask 把返回值转换成响应对象的逻辑如下:
- 如果返回的是一个合法的响应对象,它会被从视图直接返回。
- 如果返回的是一个字符串,响应对象会用字符串数据和默认参数创建。
- 如果是返回的是一个字典,则使用jsonify创建
- 如果返回的是一个元组而且元组中元素能够提供额外的信息。比如
(response, status),(response, headers), or(response, status, headers)。status 值将会覆盖状态代码,headers 可以是一个列表或额外的消息头值字典。 - 如果上述条件均不满足,Flask 会假设返回值是一个合法的 WSGI 应用程序,并转换为一个请求对象。
如果你想要获取在视图中得到的响应对象,你可以用函数 make_response() 。
想象一下,您有如下视图:
@app.errorhandler(404)
def not_found(error):
return render_template('error.html'), 404
您只需要将return表达式包装为 make_response()并获取响应对象即可对其进行修改,然后将其返回:
@app.errorhandler(404)
def not_found(error):
resp = make_response(render_template('error.html'), 404)
resp.headers['X-Something'] = 'A value'
return resp
JSON API接口
编写API时,常见的响应格式是JSON。开始使用Flask编写这样的API很容易。如果一个dict从视图函数返回 ,它将被转换为JSON响应。
@app.route("/me")
def me_api():
user = get_current_user()
return {
"username": user.username,
"theme": user.theme,
"image": url_for("user_image", filename=user.image),
}
根据您的API设计,您可能想为以外的数据类型创建JSON响应。在这种情况下,请使用 jsonify()函数,该函数将序列化所有受支持的JSON数据类型。或者查看支持更复杂应用程序的Flask社区扩展。
@app.route("/users")
def users_api():
users = get_all_users()
return jsonify([user.to_json() for user in users])
讨论区