session
session 是基于 cookie 实现, 保存在服务端的键值对, 同时在浏览器中的 cookie 中也对应一相同的随机字符串,用来再次请求的时候验证;
- 对于敏感、重要的信息,建议存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息
- 在服务器端进行状态保持的方案就是
Session
- Session 依赖于 Cookie
提高身份认证的安全性
为了防止客户伪造会员卡,收银员在拿到客户出示的会员卡之后,可以在收银机上进行刷卡认证。只有收银机确认存在的会员卡,才能被正常使用。
这种 “会员卡 + 刷卡认证” 的设计理念,就是 Session 认证机制的精髓。
设置与删除
session:请求上下文对象,用于处理http请求中的一些数据内容
在 flask 中使用 session 也很简单,只要使用 from flask import session
导入这个变量,在代码中就能直接通过读写它和 session 交互。
因为 flask 的 session 是通过加密之后放到了 cookie 中。所以有加密就有密钥用于解密,所以,只要用到了 flask 的 session 模块就一定要配置 “SECRET_KEY” 这个全局宏。一般设置为 24 位的字符。
python
# -*- coding: utf-8 -*-
from flask import Flask, session
app = Flask(__name__)
# 设置加密字符串
app.secret_key = 'secret'
@app.route('/set_session')
def index1():
session['username'] = 'zhengxinonly'
return session['username']
@app.route('/get_session')
def get_session():
# session_name = session['username']
session_name = session.get('username')
return session_name
@app.route('/del_session/')
def delete():
session.pop('username', None)
session['username'] = False
print(session.get('username'))
return "删除会话"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5050, debug=True)
过期时间
如果没有指定 session 的过期时间,那么默认是浏览器关闭后就自动结束。session.permanent = True
在 flask下则可以将有效期延长至一个月。下面有方法可以配置具体多少天的有效期。
- 如果没有指定 session 的过期时间,那么默认是浏览器关闭后就自动结束
- 如果设置了 session 的 permanent 属性为 True,那么过期时间是 31 天。
- 可以通过给
app.config
设置PERMANENT_SESSION_LIFETIME
来更改过期时间,这个值的数据类型是datetime.timedelay
类型。
一种更先进的配置有效期的方法:(比如配置7天有效)
- 1.引入包:
from datetime import timedelta
- 2.配置有效期限:
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7) # 配置7天有效
- 3.设置:
session.permanent = True
python
from flask import Flask, session
from datetime import timedelta
import os
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7) # 配置7天有效
登录案例
参考:https://www.bilibili.com/video/BV1ZN411k7nv
总结
session 使用起来很方便,但是现在用的以及不多了。因为 session 依赖 cookie , cookie 默认无法跨域。
现在主流的解决方案都是采用 jwt token 实现状态维持与权鉴。后面我们也会学这个。