首页 > 代码库 > flask 使用程序工厂函数 和 蓝本中实现程序功能

flask 使用程序工厂函数 和 蓝本中实现程序功能

使用程序工厂函数

在单个文件中开发程序很方便,但却有个很大的缺点,因为程序在全局作用域中创建,所
以无法动态修改配置。

运行脚本时,程序实例已经创建,再修改配置为时已晚。这一点对
单元测试尤其重要,因为有时为了提高测试覆盖度,必须在不同的配置环境中运行程序。


这个问题的解决方法是延迟创建程序实例,把创建过程移到可显式调用的工厂函数中。这
种方法不仅可以给脚本留出配置程序的时间,还能够创建多个程序实例,这些实例有时在
测试中非常有用。程序的工厂函数在 app 包的构造文件中定义,如示例 7-3 所示。
构造文件导入了大多数正在使用的 Flask 扩展。由于尚未初始化所需的程序实例,所以没
有初始化扩展,创建扩展类时没有向构造函数传入参数。 create_app() 函数就是程序的工
厂函数,接受一个参数,是程序使用的配置名。配置类在 config.py 文件中定义,其中保存
的配置可以使用 Flask  app.config 配置对象提供的 from_object() 方法直接导入程序。至
于配置对象,则可以通过名字从 config 字典中选择。程序创建并配置好后,就能初始化
扩展了。在之前创建的扩展对象上调用 init_app() 可以完成初始化过程。

 

在蓝本中实现程序功能


转换成程序工厂函数的操作让定义路由变复杂了。在单脚本程序中,程序实例存在于全
局作用域中,路由可以直接使用 app.route 修饰器定义。

但现在程序在运行时创建,只有调用 create_app() 之后才能使用 app.route 修饰器,这时定义路由就太晚了。和路由
一样,自定义的错误页面处理程序也面临相同的困难,因为错误页面处理程序使用 app.
errorhandler 修饰器定义。
幸好 Flask 使用蓝本提供了更好的解决方法。蓝本和程序类似,也可以定义路由。不同的
是,在蓝本中定义的路由处于休眠状态,直到蓝本注册到程序上后,路由才真正成为程序
的一部分。使用位于全局作用域中的蓝本时,定义路由的方法几乎和单脚本程序一样。
和程序一样,蓝本可以在单个文件中定义,也可使用更结构化的方式在包中的多个模块中
创建。为了获得最大的灵活性,程序包中创建了一个子包,用于保存蓝本。示例 7-4 是这
个子包的构造文件,蓝本就创建于此。

 

flask 使用程序工厂函数 和 蓝本中实现程序功能