是否有一种惯用的方式让Flask在每次请求时重新加载我的配置文件?这样做的目的是使我可以更改密码或其他与配置有关的项目,而不必在生产环境中关闭并重新启动服务器。
编辑:app.run(debug=True)是不可接受的,因为它会重新启动服务器,并且不应在生产中使用。
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')
如果相关,这是我现在如何加载配置的方法:
我的app/app/__init__.py档案:
app/app/__init__.py
from flask import Flask from settings import Config app = Flask(__name__) app.config.from_object(Config) # ...
我的app/app/settings.py档案:
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
在应用程序开始处理请求之后,您将无法安全/正确地重新加载配置。配置 只能 在应用程序安装过程中读取。主要原因是生产服务器将使用多个进程运行(甚至分布在多个服务器上),并且处理配置更改请求的工作人员无权访问其他工作人员以通知他们进行更改。另外,某些配置并非旨在重新加载,因此即使您可以通知所有其他工作程序并让他们正确地重新加载,它也可能没有任何作用。
生产型WSGI服务器可以正常重载,即它们不会杀死正在运行的工作人员,直到他们完成响应,因此停机时间实际上不是问题。如果是(实际上不是),那么您的规模如此之大,以至于超出了此答案的范围。
优雅地重新加载:
如果您需要使用可以动态更新的配置,则必须编写所有期望使用的代码。您可以使用before_request处理程序来加载每个请求的配置。但是,请记住,您未编写的任何使用config的内容都可能不会更改配置。
before_request