首页 > 解决方案 > 从不同的文件访问 Flask 会话

问题描述

我试图通过分离烧瓶应用程序、服务组件和解耦的键/值对存储来巧妙地划分我的代码。

我的网络应用程序如下所示:

import flask
import os
import service_component as service

app = flask.Flask(__name__)

@app.route("/", methods=["POST"])
def event():
    service.dostuff()
    return "ok", 200

if __name__ == "__main__":
    app.run(port=5000, debug=True)
    # for test purposes
    app.secret_key = os.urandom(24)

我的 service_component 是:

import key_value_store

def dostuff():
    val_i_want = key_value_store.provider["key"]

...和 ​​key_value_store 看起来像:

from flask import session

class SessionProvider:
    def __getitem__(self, key):
            return session.get(key)

    def __setitem__(self, key, value):
            session[key] = value

provider = SessionProvider()

问题是当我运行程序时,我得到了错误:

RuntimeError:会话不可用,因为未设置密钥。将应用程序上的 secret_key 设置为唯一且机密的东西。

在我的网络应用程序文件中保留“会话”的使用是否有一些要求?是否有推荐的方法仍然让我保持组件的松散耦合/键/值对存储的抽象?

标签: pythonpython-3.xflask

解决方案


不要在此处设置密钥:

if __name__ == "__main__":
    app.secret_key = os.urandom(24)
    app.run(port=5000, debug=True)
        return "ok", 200 # Also this does nothing here

以上仅适用于python app.py不使用flask run或使用 WSGI 服务器运行时。

这也将更改每次启动时的密钥,这是您要避免的。您确实应该通过配置加载预定义的密钥,因此用户 cookie 不会在每次应用重新启动时失效。这听起来可能会导致一些奇怪的会话持久性行为。

如果您还没有配置加载器,您可以在定义后立即对值进行硬编码app

app = Flask(__name__)
app.config['SECRET_KEY'] = 'super_secure'

当然,将关键设置为明智的事情。如果要使用 Python 生成它,请使用模块secrets不是os.urandom. 但是,出于上述原因,您应该再次将密钥作为实际字符串传递,而不是在每次应用启动时动态生成它。


推荐阅读