请稍候,加载中....

关于response对象

一个视图函数的返回值会被自动转换为一个响应对象response。如果返回值是一个字符串,它被转换成一个响应,并且响应主体是该字符串,响应代码代码为 200 OK ,媒体类型为 text/html 的响应对象。如果返回值是一个字典,那么会调用jsonify()创建响应对象。 Flask 把返回值转换成响应对象的逻辑如下:

  1. 如果返回的是一个合法的响应对象,它会被从视图直接返回。
  2. 如果返回的是一个字符串,响应对象会用字符串数据和默认参数创建。
  3. 如果是返回的是一个字典,则使用jsonify创建
  4. 如果返回的是一个元组而且元组中元素能够提供额外的信息。比如(response, status)(response, headers), or (response, status, headers)。status 值将会覆盖状态代码,headers 可以是一个列表或额外的消息头值字典。
  5. 如果上述条件均不满足,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])

 


Python学习手册-