
1.6 系统配置

在开发软件程序的过程中,经常将常用的参数和属性存储在系统配置文件中,例如用专门的文件设置连接数据库的地址,这样可以提高程序重用性。在Flask Web程序中,可以使用属性config存储Flask项目的配置信息。在本节的内容中,将详细讲解Flask系统配置的知识。
1.6.1 基础配置
在Flask Web程序中,经常配置属性config继承字典,这样可以像修改字典一样修改属性config的值。例如在下面的代码中,将属性config中的DEBUG值设置为True,这表示使用调试模式运行当前的Flask项目。

也可以使用方法update()来一次性设置多个配置键的值,例如在下面的演示代码中同时设置了两个配置选项。

在上述代码中,DEBUG和SECRET_ KEY都是Flask的内置配置键。在Flask的配置属性config中,主要包含如表1-1所示配置键。
表1-1 属性config包含的配置键

(续)

(续)

1.6.2 使用配置信息
在设置好配置信息后,需要在程序中调用这些配置信息,以便使这些配置信息对Flask Web程序起作用。在Flask Web程序中,可以通过如下两种方式使用配置信息。
1. 从文件加载配置
在现实应用中,通常将配置项存储到单独的文件中。在理想情况下,这个文件位于实际应用程序包的外部,可以通过各种不同的包处理工具(例如使用Setuptools部署)和修改配置文件,使得打包和分发应用程序成为可能。大对数开发者通常会新建一个名为config.py的配置文件,然后在里面编写和系统配置相关的代码,例如下面的演示代码。

为了使用上面配置文件config.py中的内容,可以在Flask Web程序中通过from_pyfile()加载上面的配置文件。例如下面的演示代码。

通过上述代码,引用了文件config.py中的配置信息。
2. 使用环境变量中的配置信息
在Flask Web程序中可以加载使用环境变量中的配置信息,例如在启动服务器之前,可以在Linux或者macOS操作系统中设置环境变量。例如使用如下shell的export命令来设置环境变量。

在Windows系统中,可以使用内置命令set代替export。

虽然这种使用环境变量的方法很简单,但是环境变量是字符串格式的,它们不会自动反序列化为Python类型。
例如下面是一个在配置文件中使用环境变量的演示代码。

在Python程序中,会将除空字符串外的其他的字符串解释为布尔类型True。如果想要将某个配置选项设置为False,只需将这个字符串设置为空即可。
1.6.3 实例文件夹
从Flask 0.8版本开始引入了实例文件夹这一概念,这样可以通过Flask.root_path直接引用相对应用文件夹的路径。但是这只会在应用不是包的情况下才有效,即根路径指向包内容的情况下才能工作。在Flask 0.8版本中还引入了Flask.instance_path功能,并提出了“实例文件夹”这一新颖的概念。在日常开发应用中,通常做法是将实例文件夹用在不使用版本控制和特定的部署的应用中。举个例子,在创建Flask Web程序时明确地提供了一个实例文件夹的路径,并且可以让Flask自动找到它,此时在显式配置代码中,可以使用参数instance_path实现上述要求,例如下面的演示代码。

请注意,上面instance_ path对应的路径必须是绝对路径。如果没有为参数instance_ path赋值,那么Flask会使用下面默认的位置。
• 未安装的模块。

• 未安装的包。

• 已安装的包或模块。

其中$PREFIX表示安装Python目录的前缀,这个前缀可以是/usr或者Virtualenv的路径。如果想查看这个前缀的具体值,可以通过打印sys.prefix的值的方式来实现。
如果在配置对象中提供了从相对文件名来载入配置的方式,那么也可以从相对实例路径的文件名加载配置。要想在配置文件中设置相对路径,可以基于如下两种方式进行配置。
• 基于“相对应用的根目录”,这是默认方式。
• 基于“相对实例文件夹”的目录,此种方式通过使用构造函数的instance_relative_config实现,代码如下所示。

例如下面是Flask从模块预载入配置,并覆盖配置文件夹中的配置文件(如果存在)的完整演示代码。

可以在Flask.instance_path中找到实例文件夹的路径,另外,Flask也提供了一个打开实例文件夹中文件的捷径,这就是Flask.open_instance_resource()方法。下面是使用上述两种方法的演示代码。
