python - 如何在每次请求 Flask 时重新加载配置文件?

标签 python flask

是否有一种惯用的方法让 Flask 在每次请求时重新加载我的配置文件?这样做的目的是让我可以更改密码或其他与配置相关的项目,而无需关闭并重新启动生产中的服务器。

编辑:app.run(debug=True) 是 Not Acceptable ,因为它会重启服务器并且不应在生产中使用。

也许像下面这样的装饰器:

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

最佳答案

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

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

优雅的重新加载:

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

关于python - 如何在每次请求 Flask 时重新加载配置文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39456672/

相关文章:

python - 通过 HTTPS 运行 Eve

python - SQLAlchemy为大型表定义__repr__的最佳方法

python - Adanet 内存不足

python - Flask-SQLAlchemy 单元测试失败 InvalidRequestError : Table '{table_name}' is already defined for this MetaData instance

python - 从多处理启动 celery Worker

python - jinja2 - 如何在 if 语句中放置一个 block ?

python - Pycharm 调试器 - 框架不可用

python - SQLAlchemy - 什么是 declarative_base

Python - 停止 FuncAnimation

python - 动态添加周期性任务 celery