发送HTTP请求时可以指定cookie,而在Web服务器端,一方面可以获取到客户端发送的cookie信息,另一方面还可以设置响应的cookie。Flask中获取请求cookie的方式与获取请求参数很相似,可以直接通过flask.request对象的cookies方法来获取
from flask import Flask,request
@app.route('/')
def index():
request.cookies.get('username') # 获取cookie中的username字段
return 'success'
为响应内容设置cookie也非常方便,所要做的就是在返回Flask响应对象之前,给响应对象设置指定的cookie值
from flask import make_response
@app.route('/')
def index():
resp = make_response(render_template('test.html'))
resp.set_cookie('username', 'python') # 设置响应cookie
return resp
通过访问上述示例中的处理函数对应的URL,在响应内容中便可以获取到cookie名为username的字段,并且其值为python。cookie除了上述的常规用法之外,还被用于session的实现。session在Web服务中作为保存用户凭证及相关信息的数据存储载体,市场上大部分的Web服务都会把session的全部信息保存在Web服务器上,之后为其生成一个唯一的sessionID,并在返回响应时把sessionID设置为cookie字段传递给客户端,该客户端再次发出访问请求时会自动带上这个sessionID,而Web服务通过请求的sessionID信息就可以判断该请求是否曾经访问过。
Flask中的session实现机制与其他Web服务不同,它并没有把session保存在Web服务器端,而是把session的全部信息进行序列化之后再进行一次加密操作,最后把加密后的密文设置到响应cookie中。客户端下次请求时会自动带上加密后的cookie信息,Flask服务再次通过解密和反序列化操作来获取cookie信息
from flask import Flask, session, redirect, url_for, escape, request
app = Flask(__name__)
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/' # session 加密密钥
@app.route('/')
def index():
if 'username' in session:
return '登录名:%s' % escape(session['username'])
return '登录失败'
@app.route('/login', methods=['GET'])
def login():
session['username'] = request.args['username']
return redirect(url_for('index'))
示例中定义了login和index两个接口,对应的URL分别为/login和/。在login中获取username参数值并设置为session的username值,之后把用户请求跳转至index接口;在index接口中通过获取session的username来确定当前请求的具体用户。在访问上述请求时,观察首次响应内容和第一次之后请求内容的cookie,会发现自动带上了一个名为session的cookie字段,其值为一串加密后的密文。该session字段就是前文提到的Flask实现 session的具体内容