HTTP是无状态的协议。也就是说,在一次请求响应结束后,服务器不会留下任何关于对方状态的信息。但是对于某些Web程序来说,客户端的某些信息有必须被记住,比如用户的登录状态,这样才可以根据用户的状态来返回不同的响应。为了解决这类问题,就有了Cookie技术。Cookie技术通过在请求和响应报文中添加Cookie数据来保存客户端的状态信息。

Cookie指Web服务器为了存储某些数据(比如用户信息)而保存在浏览器上的小型文本数据。浏览器会在一定时间内保存它,并在下一次向同一个服务器发送请求时附带这些数据。Cookie通常被用来进行用户会话管理(比如登录状态),保存用户的个性化信息(比如语言偏好,视频上次播放的位置,网站主题选项等)以及记录和收集用户浏览数据以用来分析用户行为等。

在Flask中,如果想要在响应中添加一个cookie,最方便的方法是使用Response类提供的set_cookie()方法。要使用这个方法,我们需要先 使用make_response()方法手动生成一个响应对象,传入响应主体作为 参数。这个响应对象默认实例化内置的Response类。

Response类的常用属性和方法

headers  一个Werkzeug的Header对象,表示响应首部,可以像字典一样操作

status  状态码,文本类型

status_code   状态码,整型

mimetype  MIME类型(仅包括内容类型部分)

set_cookie()  用来设置一个cookie

除了上面的方法和属性外,Response类同样拥有的Request类相同的get_json()方法、is_json()方法以及json属性。

set_cookie()方法支持多个参数来设置Cookie的选项

key cookie的键名(名称)

value  cookie的值

max_age  cookie被保存的时间数,单位为妙;默认在用户会话结束(即关闭浏览器)时过期

expires  具体的过期时间,一个datetime对象或UNIX时间戳

path  限制cookie只在给定的路径可用,默认为整个域名

domain  设置cookie可用的域名

secure  如果设置为True,只有通过HTTPS才可以使用

httponly  如果设置为True,禁止客户端JavaScript获取cookie

设置cookie

from flask import Flask, url_for, make_response
...
@app.route('/set/<name>')
def set_cookie(name):
    response = make_response(redirect(url_for('hello')))
    response.set_cookie('name', name)
    return response

在Flask中,Cookie可以通过请求对象的cookies属性读取。在修改后的hello视图中,如果没有从查询参数中获取到name的值,就从Cookie中寻找

from flask import Flask, request

@app.route('/')
@app.route('/hello')
def hello():
    name = request.args.get('name')
    if name is None:
        name = request.cookies.get('name', 'Human') # 从Cookie中获取name的值
    return '<h1>Hello, %s</h1>' % name

0 Comments latest

No comments.