【问题标题】:How to reload a configuration file on each request for Flask?如何在每次请求 Flask 时重新加载配置文件?
【发布时间】:2016-09-12 18:38:11
【问题描述】:

有没有一种惯用的方式让 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

【问题讨论】:

  • app.run(debug=True) 不起作用吗?
  • @iScrE4m 不;有两个原因:1)这将重新启动整个服务器,而不仅仅是重新加载配置文件; 2)我在生产中运行它
  • 只需在请求前处理程序中调用app.config.from_object
  • @dirn 但如果模块没有重新加载,更改将不会传播

标签: python flask


【解决方案1】:

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

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

优雅地重新加载:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多