Flask - flask-session

本文详细介绍了如何在Flask应用中使用RedisSessionInterface连接Redis,包括open_session方法处理新用户和会话恢复,以及save_session方法用于保存和设置Cookie。通过实例演示了配置RedisSession并实现在登录和会话持久化中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

flask_session - RedisSessionInterface的open_session和save_session方法

def open_session(self, app, request):
	# 用户第一次执行的时候, session里面没有值
    sid = request.cookies.get(app.session_cookie_name)
    # 用户第一次访问
    if not sid:
   		# _generate_sid() = str(uuid4())
   		# 生成一个随机字符串
        sid = self._generate_sid()
        # session_class = RedisSession
        # RedisSession是一个特殊的字典
        # 生成一个特殊的字典: sid=随机字符串
        return self.session_class(sid=sid, permanent=self.permanent)
    if self.use_signer:
        signer = self._get_signer(app)
        if signer is None:
            return None
        try:
            sid_as_bytes = signer.unsign(sid)
            sid = sid_as_bytes.decode()
        except BadSignature:
            sid = self._generate_sid()
            return self.session_class(sid=sid, permanent=self.permanent)

    if not PY2 and not isinstance(sid, text_type):
        sid = sid.decode('utf-8', 'strict')
    val = self.redis.get(self.key_prefix + sid)
    if val is not None:
        try:
            data = self.serializer.loads(val)
            return self.session_class(data, sid=sid)
        except:
            return self.session_class(sid=sid, permanent=self.permanent)
    return self.session_class(sid=sid, permanent=self.permanent)

def save_session(self, app, session, response):
	# 拿到当前域名
    domain = self.get_cookie_domain(app)
    # 拿cookie地址
    path = self.get_cookie_path(app)
    if not session:
        if session.modified:
            self.redis.delete(self.key_prefix + session.sid)
            response.delete_cookie(app.session_cookie_name,
                                   domain=domain, path=path)
        return

	# 
    httponly = self.get_cookie_httponly(app)
    secure = self.get_cookie_secure(app)
    expires = self.get_expiration_time(app, session)
    # 通过pickle把字典序列化
    val = self.serializer.dumps(dict(session))
    # 
    self.redis.setex(name=self.key_prefix + session.sid, value=val,
                     time=total_seconds(app.permanent_session_lifetime))
    if self.use_signer:
        session_id = self._get_signer(app).sign(want_bytes(session.sid))
    else:
        session_id = session.sid
    response.set_cookie(app.session_cookie_name, session_id,
                        expires=expires, httponly=httponly,
                        domain=domain, path=path, secure=secure)
  • session_cookie_name
    在这里插入图片描述

使用flask_session

  • 导入 : from flask_session import RedisSessionInterface
  • RedisSessionInterface : 把session放到Redis里面

链接redis

  • RedisSessionInterface需要传递一些参数 : def __init__(self, redis, key_prefix, use_signer=False, permanent=True):
    • 第一个参数 : redis=Redis(host='127.0.0.1', port=6379)
    • 第二个参数 : key_prefix , session存的时候的前缀

示例

from flask import Flask, session
from flask_session import RedisSessionInterface
from redis import Redis

app = Flask(__name__)
app.secret_key = 'asdf'

app.session_interface = RedisSessionInterface(
    redis=Redis(host='127.0.0.1', port=6379),
    key_prefix='flaskxxx'
)


@app.route('/login')
def login():
    session['k1'] = 123
    return 'login'


@app.route('/index')
def index():
    v = session['k1']
    print(v)
    return 'index'


if __name__ == '__main__':
    app.run()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值