我有一个小的烧瓶应用程序,需要一些配置。如果缺少某些内容,我想“中止”启动,以便立即发现错误。
我的WSGI脚本很简单,但也许有助于理解我的问题:
from myapp.startup import init_app
app = init_app()
因此,在ìnit_app()
中的某个地方说代码发现有问题(例如缺少配置值或过时的数据库架构版本,不安全的目录权限等),我想确保该应用程序未运行(因为以后还是会失败)。
我可以在代码中的某个地方插入sys.exit(1)
,但是flask不断尝试重试以启动应用程序(用户看不到任何页面)。当然,我可以构建一个替代WSGI应用程序来显示一些文本。
但是我希望会有某种“最佳实践”(理想情况下是现有的Python代码,因此它甚至看起来“不错”)。
答案 0 :(得分:0)
就关闭服务器而言,它似乎可以完成您想要的操作。 http://flask.pocoo.org/snippets/67/
但是,当您在启动代码中检测到错误时,可以调用该函数,而不是从端点调用。
答案 1 :(得分:0)
最近偶然发现了一个类似的问题。
返回 sys.exit(ERRNO)
无济于事,因为诸如 gunicorn
之类的 WSGI 服务器只会继续尝试启动另一个实例。
引发 RuntimeError
将导致应用程序中止。我不认为有一种“正确的方式”可以做到这一点,但这种方式对我来说似乎很 Pythonic。
像这样:
try:
SECRET_KEY = os.getenv("FLASK_SECRET").encode("utf-8")
except AttributeError:
raise RuntimeError("Environment variable $FLASK_SECRET was not set")
然后尝试使用 gunicorn
启动服务器将失败并显示错误:
.$ gunicorn -b 0.0.0.0:5000 myapi.wsgi:app
...
...
File "path/to/myapi/config.py", line 18, in <module>
raise RuntimeError("Environment variable $FLASK_SECRET was not set")
RuntimeError: Environment variable $FLASK_SECRET was not set
[2021-05-19 16:08:43 +0600] [17567] [INFO] Worker exiting (pid: 17567)
[2021-05-19 16:08:43 +0600] [17565] [INFO] Shutting down: Master
[2021-05-19 16:08:43 +0600] [17565] [INFO] Reason: Worker failed to boot.
.$