Skip to content

session

session 是基于 cookie 实现, 保存在服务端的键值对, 同时在浏览器中的 cookie 中也对应一相同的随机字符串,用来再次请求的时候验证;

  • 对于敏感、重要的信息,建议存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息
  • 在服务器端进行状态保持的方案就是 Session
  • Session 依赖于 Cookie

提高身份认证的安全性

为了防止客户伪造会员卡,收银员在拿到客户出示的会员卡之后,可以在收银机上进行刷卡认证。只有收银机确认存在的会员卡,才能被正常使用。

image-20220716164716505

这种 “会员卡 + 刷卡认证” 的设计理念,就是 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 实现状态维持与权鉴。后面我们也会学这个。