有没有一种惯用的方法让 Flask 在每个请求上重新加载我的配置文件?这样做的目的是让我可以更改密码或其他与配置相关的项目,而无需在生产中关闭和重新启动服务器。
编辑:app.run(debug=True)
不可接受,因为它会重新启动服务器,不应在生产中使用。
也许像下面这样的装饰器:
def reload_configuration(func):
@wraps(func)
def _reload_configuration(*args, **kwargs):
#even better, only reload if the file has changed
reload(settings)
app.config.from_object(settings.Config)
return func(*args, **kwargs)
return _reload_configuration
@app.route('/')
@reload_configuration
def home():
return render_template('home.html')
Run Code Online (Sandbox Code Playgroud)
如果相关,这是我现在加载配置的方式:
我的app/app/__init__.py
文件:
from flask import Flask
from settings import Config
app = Flask(__name__)
app.config.from_object(Config)
# ...
Run Code Online (Sandbox Code Playgroud)
我的app/app/settings.py
文件:
class Config(object):
SQLALCHEMY_TRACK_MODIFICATIONS = False
SECRET_KEY = os.urandom(32)
# ...
try:
from app.local_settings import Config
except ImportError:
pass
Run Code Online (Sandbox Code Playgroud)
在应用程序开始处理请求后,您无法安全/正确地重新加载配置。配置仅用于在应用程序设置期间读取。主要原因是因为生产服务器将使用多个进程运行(甚至分布在服务器之间),并且处理配置更改请求的工作人员无权访问其他工作人员来告诉他们进行更改。此外,某些配置并非旨在重新加载,因此即使您可以通知所有其他工作人员并让他们正确重新加载,它也可能没有任何影响。
生产 WSGI 服务器可以优雅地重新加载,也就是说,在他们完成响应之前,它们不会杀死正在运行的工作人员,因此停机时间实际上不应该成为问题。如果是(实际上不是),那么您的规模如此之大,以至于超出了此答案的范围。
优雅地重新加载:
如果您需要使用可以动态更新的配置,则必须编写所有用于预期的代码。您可以使用before_request
处理程序来加载每个请求的新配置。但是,请记住,您未编写的任何使用 config 的内容可能都不会期望 config 更改。