FLASK中的配置

来源:http://exploreflask.com/en/latest/configuration.html

当你学习Flask时,配置看起来很简单。你只需要在config.py中定义一些变量,所有的东西都可以工作。当您必须管理生产应用程序的配置时,这种简单性就会逐渐消失。您可能需要保护秘密的API密钥,或者针对不同的环境(例如开发和生产环境)使用不同的配置。在本章中,我们将讨论一些高级的Flask特性,这使得这种管理配置更加容易。

1、简单的情况

一个简单的应用程序可能不需要这些复杂的特性。您可能只需要将config.py放在存储库的根中,并将它加载到app.py或您的app/__init__.py中。

config.py文件应该每行包含一个变量赋值。当您的应用程序初始化时,config.py中的变量用于配置Flask,它的扩展可以通过app.config字典来访问,例如app.config["DEBUG"]。

配置变量可以由Flask、extensions或您自己使用。在本例中,当我们需要事务电子邮件的默认“from”地址时,我们可以使用app.config[“MAIL_FROM_EMAIL”]—例如,密码重置。将这些信息放入配置变量中,很容易在将来更改它。

DEBUG:为调试错误提供了一些方便的工具。这包括基于web的堆栈跟踪和针对错误的交互式Python控制台。在开发中要设为真,在生产中要设为假。

SECRET_KEY:这是Flask用来标记cookie的秘密密钥。它也被扩展使用,比如Flask-Bcrypt。您应该在实例文件夹中定义它,以使它不受版本控制。您可以在下一节中阅读更多关于实例文件夹的内容。这应该是一个复杂的随机值。

BCRYPT_LOG_ROUNDS:如果使用Flask-Bcrypt对用户密码进行散列,则需要指定算法在散列密码时执行的“轮数”。如果你不使用Flask-Bcrypt,你应该开始使用。使用散列密码的轮数越多,攻击者在给定散列后猜测密码所需的时间就越长。随着计算能力的增加,轮数应该会增加。

2、实例的文件夹

有时需要定义包含敏感信息的配置变量。我们要把这些变量和配置中的变量分开。并将它们保存在存储库之外。您可能隐藏了数据库密码和API密钥之类的秘密,或者定义了特定于给定机器的变量。为了简单起见,Flask提供了一个名为instance folders的特性。实例文件夹是存储库根的子目录,它包含一个特定于应用程序这个实例的配置文件。我们不想将它提交到版本控制中。

2.1使用实例文件夹

要从实例文件夹中加载配置变量,我们使用app.config.from_pyfile()。如果在使用Flask()调用创建应用程序时设置instance_relative_config=True,那么app.config.from_pyfile()将从instance/目录加载指定的文件。

现在,我们可以在instance/config.py中定义变量,就像在config.py中一样。您还应该将实例文件夹添加到版本控制系统的忽略列表中。要使用Git执行此操作,您将在.gitignore中添加instance/在一个新行中。

2.2密钥

实例文件夹的私有性质使它成为定义您不想在版本控制中公开的键的最佳选择。这些可能包括应用程序的秘密密钥或第三方API密钥。如果您的应用程序是开源的,或者在将来的某个时候,这一点尤为重要。我们通常希望其他用户和贡献者使用他们自己的密钥。


2.3小环境相关的配置

如果您的生产环境和开发环境之间的差异非常小,您可能希望使用实例文件夹来处理配置更改。instance/config.py文件中定义的变量可以重写config.py中的值。您只需要在app.config.from_pyfile()之后调用app.config.from_object()。利用这一点的一种方法是改变应用程序在不同机器上的配置方式。

在生产过程中,我们会将上面清单中的变量排除在instance/config.py之外,它将回到config.py中定义的值。

3、基于环境变量进行配置

实例文件夹不应该在版本控制中。这意味着您将无法跟踪对实例配置的更改。这可能不是一个或两个变量的问题,但是如果您有针对不同环境(生产、阶段、开发等)的优化配置,您就不希望失去它。

Flask使我们能够根据环境变量的值在负载上选择配置文件。这意味着我们可以在存储库中配置多个配置文件,并且总是加载正确的配置文件。一旦我们有了几个配置文件,我们就可以将它们移动到它们自己的配置目录中。

在这个清单中,我们有几个不同的配置文件。

config/default.py:默认值,用于所有环境或被个别环境覆盖。一个例子可能是在config/default.py中设置DEBUG = False,在config/development.py中设置DEBUG = True。

config/development.py:在开发过程中要使用的值。这里,您可以指定位于localhost上的数据库的URI。

config/production.py:用于生产中的值。这里,您可以指定数据库服务器的URI,而不是用于开发的localhost数据库URI。

config/staging.py:根据部署过程的不同,您可能有一个阶段步骤,在模拟生产环境的服务器上测试对应用程序的更改。您可能会使用不同的数据库,并且您可能想要更改登台应用程序的其他配置值。

要决定加载哪个配置文件,我们将调用app.config.from_envvar()。


环境变量的值应该是配置文件的绝对路径。

我们如何设置这个环境变量取决于我们运行该应用的平台,如果我们运行在一个普通的Linux服务器上,我们可以设置一个shell脚本,该脚本设置环境变量并运行run.py。


start.sh对每个环境都是惟一的,因此应该将其排除在版本控制之外。在Heroku上,我们将使用Heroku工具设置环境变量。同样的想法也适用于其他PaaS平台。

总结

一个简单的应用程序可能只需要一个配置文件:config.py。

实例文件夹可以帮助我们隐藏隐藏的配置值。

实例文件夹可用于为特定环境更改应用程序的配置。

对于更复杂的基于环境的配置,我们应该使用环境变量和app.config.from_envvar()。

你可能感兴趣的:(FLASK中的配置)