You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在首次请求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 01:27:01