前言: cookie与session都是常用的会话技术,其目的都是为了解决短连接及不同请求间的传值问题。不同的是,cookie的数据由客户端(即浏览器)负责存储管理,而session由服务端管理。下面对两种技术分别进行介绍。
一、cookie
上面说到,cookie是存储在客户端的,那这存储的数据从何而来呢?答案是从服务器来的,即在一次正确的请求响应后,服务器返回一个响应对象,其中就设置了cookie。
了解了cookie的设置原理,那在python中如何实现呢?这在flask中十分简单,往下看:
- 设置cookie
from flask import Flask, Response
app = Flask(__name__)
@app.route('/set-cookie')
def set_cookie():
resp = Response(response='设置cookie') #实例化返回对象
resp.set_cookie('name','cookie',expires=None) #设置cookie
return resp
注:
- expires参数设置cookie的过期时间,以秒为单位,或直接指定具体日期。为None时表示永不过期。
- flask中cookie支持中文值(通过先编码,后解码实现)
- cookie不可跨域名和浏览器!
- 获取cookie
from flask import Flask, request
app = Flask(__name__)
@app.route('/get-cookie')
def get_cookie():
name = request.cookies.get('name') #根据键名获取cookie值
return '刚才设置的cookie值为%s'%name
- 删除cookie
@app.route('/delete-cookie')
def delete_cookie():
resp = redirect(url_for('login')) #实例化响应对象,转移到其他页面
resp.delete_cookie('name') #根据键名删除
return resp
二、session
在flask中,使用session时,有两点需要注意:
- 基于安全考虑,得先设置一个变量值 SECRET_KEY = ‘xxx’,这个值可以自由定义,但不要过于简单!
- 自带的session依赖于cookie存在,创建后,加密后的session id会被存到cookie中,数据存到内存中。
注:session的本质是一个字典,所以其操作与一般字典操作相同,使用方法如下:
- 存储数据
from flask import Flask,session
app = Flask(__name__)
app.config['SECRET_KEY'] = 'sldfjlglgjoek434l3lkj9798' #设置SECRET_KEY
@app.route('/session-save')
def session_save():
session['username'] = 'session' #存储数据
return 'session存储成功'
结果如下:
- 取数据
@app.route('/session-get')
def session_get():
username = session.get('username') #取数据
return '欢迎你:%s'%username
- 删除数据
@app.route('/session-delete')
def session_delete():
session.pop('username')
return 'username删除成功'
三、总结
在flask中,cookie与session的操作相对简单,但原生的session存储方式单一,且风险较大。
解决办法:使用flask-session插件,用 redis 进行缓存或其他方式存储。具体使用:请查看flask-session使用手册