Flask:通过 OS 环境变量覆盖 config.py 文件的环境变量

Posted

技术标签:

【中文标题】Flask:通过 OS 环境变量覆盖 config.py 文件的环境变量【英文标题】:Flask: overwrite environment variables of config.py file via OS environment variables 【发布时间】:2018-06-22 20:01:30 【问题描述】:

我有一个烧瓶应用程序,它使用以下格式来加载配置值。

#in application.py file

app = Flask(__name__, instance_relative_config=True)
app.config.from_object(app_config)
app.config.from_pyfile('config.py')


#in config.py file

class Config(object):
    DEBUG = True
    SQLALCHEMY_ECHO = True

app_config = Config

# in instance/config.py
SECRET_KEY = '........'
SQLALCHEMY_DATABASE_URI = 'mysql://root:.......'

我正在将它部署到 aws elastic-beanstalk。在那里我可以使用 aws Web 控制台设置环境变量。

有没有办法可以在 aws 管理区域中设置 SQLALCHEMY_DATABASE_URI,并让它覆盖在 config.py 文件中加载的 SQLALCHEMY_DATABASE_URI

以上只是一个示例,我有一长串配置值,我只想保留在 aws 上。

【问题讨论】:

【参考方案1】:

对于 Flask 的 app.config,在第一组变量之后加载第二组变量。下面的 Flask 示例引用了两种不同的访问方法,但它也应该适用于类似的连续上传。

Most applications 需要不止一种配置。生产服务器和开发期间使用的服务器至少应该有单独的配置。处理此问题的最简单方法是使用始终加载的默认配置和版本控制的一部分,以及根据上面示例中提到的必要覆盖值的单独配置:

app = Flask(__name__)
app.config.from_object('yourapplication.default_settings')
app.config.from_envvar('YOURAPPLICATION_SETTINGS')

要进行更明确的覆盖,请在从现有配置文件加载配置后查看使用 flask app.config.update。

update([other]) 使用其他键/值对更新字典,覆盖现有键。返回无。

app.config.from_envvar('DEFAULT_CONFIG_FILE')
app.config.update('OVERRIDING_CONFIG_FILE')

http://flask.pocoo.org/docs/1.0/config/

【讨论】:

【参考方案2】:

你应该import os,然后

SQLALCHEMY_DATABASE_URI = os.getenv('SQLALCHEMY_DATABASE_URI',
                                    'sqlite:////tmp/your_default.db')

如果您希望在未指定 URI 的情况下引发异常,请指定 os.getenv['SQLALCHEMY_DATABASE_URI']。请注意避免将此类分配推迟到import 时间之后。

编辑:在使用之前分配 URI。例如,OP 问题指定分配“# in instance/config.py”。

【讨论】:

我在 instance/config.py 文件中这样做? (更像是一个 .env 文件)

以上是关于Flask:通过 OS 环境变量覆盖 config.py 文件的环境变量的主要内容,如果未能解决你的问题,请参考以下文章

flask os.environ 的作用

Python Flask-Mail环境变量配置

Flask:程序结构

Flask - 访问模板中的配置变量

使用环境覆盖 Spring Cloud Config 值

Flask之模板之特殊变量和方法