Skip to main content

Flask 1.0 快速入手 【三】

Flask 1.0 快速入手 【三】

Flask 1.0 快速入手 【三】

Cookies

你可以通过cookies这个属性来访问到cookies,可以使用响应对象的set_cookie方法来设置cookies。请求对象的cookies属性是一个字典类型,它包含了所有从客户端传递过来的cookies数据。如果你想使用cookies,不要直接使用cookies,而是使用Flask中的Sessions,它为您在cookies的上一层添加了一些安全的处理。

读取cookies

from flask import request

@app.route('/')
def index():
    username = request.cookies.get('username')
    # 为了避免键值不存在的情况,使用cookies.get(key)替换cookies[key]

存储cookies

from flask import make_response

@app.route('/')
def index():
    resp = make_response(render_template('....'))
    resp.set_cookie('username', 'the other username')
    return resp

请注意,cookies是在响应对象中设置的。由于我们通常只是从视图函数返回字符串,Flask会为你将它们转换为响应对象。如果您明确要这样做,可以使用make_response()函数然后修改它。

有时您可能希望在响应对象尚不存在的位置设置cookie,这可以通过使用延迟请求回调模式来实现。

为此,请参阅关于响应

重定向和错误

将用户重定向到另一个端点,使用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', error=error), 404

请注意render_template()调用后的404。这将告诉Flask页面的状态码是404,404意味着页面不存在。默认情况下,页面状态码为200,意思是:一切正常。

有关详细信息,请参阅错误处理程序

关于响应

视图函数返回的值被自动转换为一个响应对象。如果返回值是一个字符串,它将被转换为一个带有该字符串的响应对象作为响应体,状态码200和一个text/htmlMIME类型。Flask转换返回值为一个响应对象的逻辑如下:

  1. 如果返回一个正确类型的响应对象,这个响应对象将会从视图函数直接返回。
  2. 如果返回一个字符串,一个影响对象将携带改字符串和默认的参数被创建。
  3. 如果返回元组,则元组中的项可以提供额外信息。这样的元组必须采用(response, status, headers)(response, headers)的形式,其中至少有一个项目必须在元组中。status值将覆盖状态代码,headers可以是其他标头值的列表或字典。
  4. 如果这些都不起作用,Flask将假定返回值是有效的WSGI应用程序并将其转换为响应对象。

如果要在视图中获取生成的响应对象,可以使用make_response()函数。

假如你有一个像下面这样的视图

@app.errorhandler(404)
def not_found(error):
    return render_template('error.html', 404)

您只需要使用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
版权声明

版权声明

张大鹏 创作并维护的 Walkerfree 博客采用 创作共用保留署名-非商业-禁止演绎4.0国际许可证。本文首发于 Walkerfree 博客(http://www.walkerfree.com/),版权所有,侵权必究。本文永久链接:http://www.walkerfree.com/article/149