【问题标题】:Accessing Flask Session From Different Files从不同的文件访问 Flask 会话
【发布时间】:2020-08-18 19:35:20
【问题描述】:

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

我的网络应用如下所示:

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 设置为唯一且保密的内容。

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

【问题讨论】:

  • 你在哪里设置应用程序?你不需要app = Flask()吗?
  • @minboost - 是的,我复制/粘贴失败了,但修复了它。

标签: python python-3.x flask


【解决方案1】:

不要在此处设置密钥:

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 生成它,请使用 the secrets module 而不是 os.urandom。但是,出于上述原因,您应该再次将密钥作为实际字符串传递,而不是在每次应用启动时动态生成。

【讨论】:

  • 你说得对,尽管我的退货声明只是复制/粘贴的错误。但是,这似乎并不是我问题的核心,即:为什么单独的模块中会出现会话错误?
  • 忽略:您在主要诊断中实际上是正确的;我在一个没有在 dunder main 中设置密钥的环境中进行调试。谢谢!!!
猜你喜欢
  • 2016-05-12
  • 2013-11-10
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多