如何在Flask的每个请求上重新加载配置文件?

时间:2016-09-12 18:38:11

标签: python flask

是否有一种惯用的方法让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')

如果相关,我现在就是如何加载配置:

我的app/app/__init__.py文件:

from flask import Flask
from settings import Config

app = Flask(__name__)
app.config.from_object(Config)

# ...

我的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

1 个答案:

答案 0 :(得分:4)

在应用程序开始处理请求后,您无法安全/正确地重新加载配置。在应用程序设置期间,Config仅 意味着要读取。主要原因是生产服务器将使用多个进程运行(甚至跨服务器分布),处理配置更改请求的工作人员无权访问其他工作人员以告知他们更改。此外,某些配置并非设计为重新加载,因此即使您可以通知所有其他工作人员并让他们正确地重新加载,也可能没有任何效果。

生产WSGI服务器可以优雅地重新加载,也就是说,在他们完成响应之前,他们不会杀死正在运行的工作人员,因此停机时间实际上不应成为问题。如果是(并且它确实不是),那么你的规模如此之大,以至于你超出了这个答案的范围。

优雅的重装:

如果您需要使用可以动态更新的配置,则必须编写您期望使用的所有代码。您可以使用before_request处理程序为每个请求加载配置。但是,请记住,您没有使用配置编写的任何内容都可能不会期望配置发生更改。