重定向和错误
要将用户重定向到另一个点,请使用 redirect() 函数;要用指定错误代码中止请求,请使用 abort() 函数:
from flask import abort, redirect, url_for
@app.route('/')
def index():
return redirect(url_for('login'))
@app.route('/login')
def login():
abort(401)
this_is_never_executed()
这是一个毫无意义的例子,因为用户将被从 index 重定向到一个他们无法访问的页面(401表示拒绝访问),但它显示了这是如何工作的。
默认情况下,每个错误代码都会显示一个黑白错误页面。如果要自定义错误页面,可以使用 errorhandler() 装饰器:
from flask import render_template
@app.errorhandler(404)
def page_not_found(error):
return render_template('page_not_found.html'), 404
请注意 render_template() 调用之后的 404。这告诉 Flask,该页面的状态代码应该是 404,这意味着找不到。默认情况下为 200,这意味着:一切顺利。
Response
视图函数的返回值会自动转换为响应对象。如果返回值是一个字符串,它将被转换为一个响应对象,该字符串作为响应体,一个 200 OK 状态代码和一个 text/html mimetype。如果返回值是字典类型,则调用 jsonify() 生成响应对象。Flask 用于将返回值转换为响应对象的逻辑如下:
1. 如果返回了正确类型的响应对象,则直接从视图返回。
2. 如果是字符串,则会使用该数据和默认参数创建一个响应对象。
3. 如果是字典数据,则使用 jsonify 创建响应对象。
4. 如果返回一个元组,元组中的项可以提供额外的信息。这样的元组必须是 (response, status),(response, headers) 或 (response, status, headers) 形式。status 值将覆盖状态代码,headers 可以是具有附加头部值的列表或字典。
5. 如果这些都不起作用,Flask 将假定返回值是有效的 WSGI 应用程序,并将其转换为响应对象。
如果想在视图中获得结果响应对象,可以使用 make_response() 函数。
假设有这样一个视图:
from flask import render_template
@app.errorhandler(404)
def not_found(error):
return render_template('error.html'), 404
只需使用 make_response() 包装返回表达式,获取响应对象并修改,然后把它返回:
from flask import 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很容易。如果从视图返回字典数据,它将转换为 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 社区寻找支持更复杂应用程序的扩展。
原文:
https://flask.palletsprojects.com/en/2.0.x/quickstart/