如何在首次请求Flask blueprint前仅执行一次方法生成固定关联key
实现方案
你当前的before_request写法存在两个核心问题:一是没有做key存在性判断,每次请求都会生成新值;二是before_request如果直接返回非None值,会被Flask直接作为响应返回,不会进入后续路由逻辑,完全不符合需求。调整方案如下:
1. 改造蓝图前置钩子逻辑
利用redis支撑的session本身和用户客户端绑定的特性,把生成的key存在session中做判断,仅首次请求蓝图下路由时生成key:
import random from flask import session @child.before_request def init_child_record_key(): # 仅当session中不存在业务key时才生成 if "child_record_key" not in session: new_key = f"{random.randint(12457, 999998)}" session["child_record_key"] = new_key # 初始化该key对应的空存储结构,后续路由直接填充数据即可 session[new_key] = {}
2. 各路由复用同一个key操作数据
在child names、child address等所有蓝图下的路由中,直接从session取固定key操作关联数据即可:
@child.route("/child-names", methods=["POST"]) def save_child_name(): current_key = session["child_record_key"] # 填充姓名数据 session[current_key]["child_name"] = request.form.get("child_name") # *修改session嵌套结构后必须手动标记修改,才会同步到redis* session.modified = True return "保存成功" @child.route("/child-address", methods=["POST"]) def save_child_address(): current_key = session["child_record_key"] # 填充地址数据 session[current_key]["child_address"] = request.form.get("child_address") session.modified = True return "保存成功"
额外说明
- key的有效期和session本身的过期时间保持一致,符合常规表单填写的业务周期
- 如果需要支持同一用户同时录入多份儿童信息,可额外新增切换key的逻辑即可
- 如果不需要保留旧的录入数据,用户重新进入表单时可主动删除session中的
child_record_key触发重新生成
内容的提问来源于stack exchange,提问作者Deepak_Spark_Beginner
相关产品推荐
相关产品推荐

