Flask中如何实现/sms路由的phone_no变量在/paynow路由中调用
Flask跨路由共享phone_no变量的实现方案
推荐方案:使用Session(用户会话绑定,无串号风险)
Session是Flask原生提供的用户级会话存储,每个用户的Session独立,不会出现多用户数据混淆的问题,是这类场景的最优解。
实现步骤:
- 首先配置SECRET_KEY(Session加密必备),在app实例初始化后添加配置:
# 生产环境请将密钥存入环境变量读取,不要硬编码在代码中 app.config["SECRET_KEY"] = "请替换为你自己的复杂随机加密字符串"
- 在
/sms路由中导入Session并存储phone_no:
from flask import session # 顶部导入session模块 @app.route("/sms", methods=['POST']) def sms_reply(): """Respond to incoming calls with a simple text message.""" # Fetch the message msg = request.form.get('Body') phone_no = request.form.get('From') # 将手机号存入当前用户的Session session["phone_no"] = phone_no reply = fetch_reply(msg, phone_no) # Create reply resp = MessagingResponse() resp.message(reply) return str(resp)
- 在
/paynow路由中读取Session中的phone_no使用,同时添加异常判断:
@app.route("/paynow", methods=['POST','GET']) def paynow(): # 从Session读取手机号,不存在则返回错误提示 phone_no = session.get("phone_no") if not phone_no: return "请先完成短信验证", 400 paynow = Paynow( '36958', '88s25s66-335d-58dq-6632-cf4e5dfb5615', 'http://google.com', 'http://google.com' ) payment = paynow.create_payment('Gonai Subscription', 'krchikwangwani@gmail.com') payment.add('Payment for Qray Gonai subscription', 350) # 注意此处不要给phone_no加引号,你原代码的'phone_no'是硬编码字符串,会报错 response = paynow.send_mobile(payment, phone_no, 'ecocash') if(response.success): poll_url = response.poll_url print("Poll Url: ", poll_url) status = paynow.check_transaction_status(poll_url) print("Payment Status: ", status.status) # 支付完成后可选清理Session中的手机号 session.pop("phone_no", None) return "success"
可选方案:数据库持久化存储
如果需要长期保留用户手机号、或者跨设备使用,可以将手机号和用户唯一标识(如用户ID、设备ID)绑定存入数据库,在/paynow路由中根据当前用户的唯一标识查询对应手机号即可。
禁止使用的错误方案
- 不要用全局变量存储:生产环境Flask多进程/多线程模式下,全局变量会被所有用户共享,会出现A用户的手机号被B用户调用的严重安全问题。
- 不要用Flask的
g变量存储:g变量的生命周期仅为单次请求,跨路由请求就会失效,无法满足需求。
内容的提问来源于stack exchange,提问作者Kurai Chikwangwani
相关产品推荐
相关产品推荐

