python - 从不同的文件访问 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 设置为唯一且机密的东西。
在我的网络应用程序文件中保留“会话”的使用是否有一些要求?是否有推荐的方法仍然让我保持组件的松散耦合/键/值对存储的抽象?
解决方案
不要在此处设置密钥:
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
. 但是,出于上述原因,您应该再次将密钥作为实际字符串传递,而不是在每次应用启动时动态生成它。
推荐阅读
- java - 无法在 onSuccess 和 onFailure 处 @Override
- java - 在 Java 中将字符串元素添加到整数列表中
- reactjs - prop-types oneOf 允许所有字符串
- svg - svgr 未知的命令行选项:azure devops 管道中的“--ext”
- elixir - 如何从主管同时生成多个进程?
- tensorflow - 如何解析张量流事件文件?
- mysql - 我的案例总和似乎重复了两次
- amazon-web-services - AWS s3 跨账户网站 AccessDenied
- loops - 如何在 Kotlin 中循环播放按钮的动画?
- php - PHP isset GET中的唯一标识符链接值接收失败