首页 > 解决方案 > Flask Session 在 POST 请求之间不保留值

问题描述

所以我使用烧瓶来创建端点作为接收器和数据处理器。我有两个 http POST 请求线程,第一个被发送到第一个路由,第二个类似。问题是我希望仅在第一个处理器被触发时才触发第二个处理器,所以我创建了一个会话密钥,以验证第二个处理器的执行。

但无论我做什么,当我将 POST 发送到第二个处理器时,会话密钥总是被擦除。这是我的代码,已简化。请原谅我表达问题的业余能力,我对编码非常陌生。

from flask import Flask, request, redirect, url_for, session

app = Flask(__name__)
app.secret_key = "abc"

@app.route('/first_processor', methods=['POST'])
def first_processor():
    data = {
        'message': 'json received',
        'json': request.json
    }
    cond = data['json']

    if cond['event'] == "message:received":
        session["key"] = cond['key']
        return redirect(url_for("second_processor"))
    else:
        return data

@app.route('/second_processor', methods=['POST'])
def second_processor():
    if "key" in session:
        print('OK')
    else:
        print("FAIL")
    return data

if __name__ == "__main__":
    app.run(debug=True)

标签: pythonsessionflask

解决方案


显然我看到了两个小问题。第一个是

@app.route('/second_processor', methods=['POST']) `

只允许POST方法,并且

redirect(url_for("second_processor"))

是一个GET请求。而且您不能强制POST提出请求。即使根据文档,函数中有一个_method 参数url_for
相关问题:在 Flask 中使用 url_for 发出 POST 请求

第二个问题是您在函数data内部创建了变量first_processor,但没有将其传递给second_processor.

 if 'key' in session:
        print('OK')
    else:
        print("FAIL")
-->    return data

你可以:

  • 在会话内传递数据,
  • 使数据全局化(虽然不确定这是否是一个好习惯)
  • 将数据存储在文件或数据库中并在 second_processor 中读取。

推荐阅读