- 代码功能概述
- 这段代码展示了如何使用Flask框架将用户会话(session)数据保存到Redis中。它利用了
flask - redis和flask - session两个扩展库,实现了将Flask应用的会话数据高效地存储在Redis数据库中。
- 导入模块
from flask import Flask
from flask_redis import FlaskRedis
from flask_session import Session
from flask import session
Flask是核心的Web应用框架。
FlaskRedis用于在Flask应用中方便地集成Redis。
Session来自flask - session,用于管理会话存储。
session用于在Flask应用中操作会话数据。
- 创建实例
app = Flask(__name__, template_folder="templates", static_folder="static")
redis0 = FlaskRedis(config_prefix="REDIS")
redis1 = FlaskRedis(config_prefix="SESSION_REDIS")
session_store = Session()
- 创建了Flask应用实例
app,并指定了模板文件夹和静态文件文件夹。
- 创建了两个
FlaskRedis实例redis0和redis1,分别用于不同的Redis配置,config_prefix用于区分不同的配置前缀。
- 创建了
Session实例session_store,用于管理会话存储。
- 配置部分
app.config.update({
"DEBUG": True,
"SECRET_KEY": "*(%#4sxcz(^(#$#8423",
"REDIS_URL": "redis://:123456@127.0.0.1:6379/0",
"SESSION_REDIS_URL": "redis://:123456@127.0.0.1:6379/1",
"SESSION_TYPE": "redis",
"SESSION_PERMANENT": True,
"SESSION_USE_SIGNER": True,
"SESSION_KEY_PREFIX": "session:",
"SESSION_REDIS": redis1
})
- 通用配置:
DEBUG: True开启调试模式,方便开发过程中查看错误信息。
SECRET_KEY是用于加密会话数据的密钥,必须设置且保密,以防止会话数据被篡改。
- Redis配置:
REDIS_URL配置了一个Redis连接地址,这里用于redis0实例,连接到本地Redis服务器,密码为123456,端口为6379,使用数据库0。
SESSION_REDIS_URL配置了另一个Redis连接地址,用于redis1实例,连接到同一台Redis服务器,但使用数据库1,专门用于存储会话数据。
- 会话配置:
SESSION_TYPE: "redis"指定使用Redis作为会话存储类型。
SESSION_PERMANENT: True设置为True时,关闭浏览器会话就会失效。
SESSION_USE_SIGNER: True对发送到浏览器的会话cookie值添加签名,增强数据安全性,防止被篡改。
SESSION_KEY_PREFIX: "session:"设置会话在Redis中存储的键的前缀为session:。
SESSION_REDIS: redis1指定使用redis1实例来连接Redis存储会话数据。
- 初始化实例
redis0.init_app(app)
redis1.init_app(app)
session_store.init_app(app)
- 先初始化两个
FlaskRedis实例redis0和redis1,将它们与Flask应用关联起来。
- 然后初始化
session_store,注意要在Redis实例初始化之后进行,确保Redis连接可用。
- 定义路由
/路由:@app.route("/")
def index():
return "ok"
返回简单的“ok”响应,作为应用的默认路由。
/set路由:@app.route("/set")
def set_session():
session["uname"] = "xiaoming"
session["age"] = 18
return "ok"
在会话中设置两个键值对,uname对应值为xiaoming,age对应值为18,这些数据会被保存到Redis中。
/get路由:@app.route("/get")
def get_session():
print(session.get("uname"))
print(session.get("age"))
return "ok"
从会话中获取uname和age的值并打印,获取的数据是从Redis中读取并反序列化后的结果。
/del路由:@app.route("/del")
def del_session():
print(session.pop("uname"))
print(session.pop("age"))
return "ok"
从会话中删除uname和age键值对,这里的删除是直接删除保存在Redis中的对应会话数据。当所有会话数据被删除,对应的Redis键也会消失。
- 启动应用
if __name__ == '__main__':
app.run()
确保脚本直接运行时,启动Flask应用。