### 导航
- [索引](# "总目录")
- [下一页](# "应用调度") |
- [上一页](# "大型应用") |
- [Flask 0.10.1 文档](#) »
- [Flask 代码模式](#) »
# 应用程序的工厂函数
如果您已经开始使用包和蓝图([*用蓝图实现模块化的应用*](#))辅助您的应用开发了,那么这里还有一些非常好的办法可以进一步的提升开发体验。当蓝图被导入的时候,一个通用的模板将会负责创建应用程序对象。但是如果你将这个对象的创建工作移交给一个函数来完成,那么你就可以在此后创建它的多个实例。
这么做的目的在于:
1. 测试。你可以使用多个应用程序的实例,为每个实例分配分配不同的配置,从而测试每一种不同的情况。
1. 多个实例。想象以下情景:您需要同时运行同一个应用的不同版本,您当然可以在你的Web服务器中配置多个实例并分配不同的配置,但是如果你使用工厂函数,你就可以在一个随手即得的进程中运行这一个应用的不同实例了!
那么该如何使用他们呢?
### 基础的工厂函数
您可以像下面展示的这样,从一个函数里启动这个应用:
~~~
def create_app(config_filename):
app = Flask(__name__)
app.config.from_pyfile(config_filename)
from yourapplication.views.admin import admin
from yourapplication.views.frontend import frontend
app.register_blueprint(admin)
app.register_blueprint(frontend)
return app
~~~
有得必有失,在导入时,您无法在蓝图中使用这个应用程序对象。然而您可以在一个请求中使用他。如果获取当前配置下的对应的应用程序对象呢?请使用:[current_app](# "flask.current_app") 函数:
~~~
from flask import current_app, Blueprint, render_template
admin = Blueprint('admin', __name__, url_prefix='/admin')
@admin.route('/')
def index():
return render_template(current_app.config['INDEX_TEMPLATE'])
~~~
在这里我们从配置中查找一个网页模板文件的名字。
### 使用应用程序
所以,要使用这样的一个应用,你必须先创建这个应用对象,这里是一个运行此类程序的 run.py 文件的例子:
~~~
from yourapplication import create_app
app = create_app('/path/to/config.cfg')
app.run()
~~~
### 工厂函数的改进
前文所提供的工厂函数并不是特别聪明好用,您可以改进它,如下的改变可以是直接且可行的:
1. 使得在单元测试中传入配置值成为可行,以使您不必在文件系统中创建多个配置文件。
1. 在程序初始时从蓝图中调用一个函数,这样您就有机会修改应用的参数属性了(就像在在请求处理器前后的调用钩子等)
1. 如果必要的话,在应用正在被创建时添加 WSGI 中间件。
© 版权所有 2013, Armin Ronacher.
- 欢迎使用 Flask
- 前言
- 给有经验程序员的前言
- 安装
- 快速入门
- 教程
- 介绍 Flaskr
- 步骤 0: 创建文件夹
- 步骤 1: 数据库模式
- 步骤 2: 应用设置代码
- 步骤 3: 创建数据库
- 步骤 4: 请求数据库连接
- 步骤 5: 视图函数
- 步骤 6: 模板
- 步骤 7: 添加样式
- 福利: 应用测试
- 模板
- 测试 Flask 应用
- 记录应用错误
- 配置处理
- 信号
- 即插视图
- 应用上下文
- 请求上下文
- 用蓝图实现模块化的应用
- Flask 扩展
- 与 Shell 共舞
- Flask 代码模式
- 大型应用
- 应用程序的工厂函数
- 应用调度
- 使用 URL 处理器
- 部署和分发
- 使用 Fabric 部署
- 在 Flask 中使用 SQLite 3
- 在 Flask 中使用 SQLAlchemy
- 上传文件
- 缓存
- 视图装饰器
- 使用 WTForms 进行表单验证
- 模板继承
- 消息闪现
- 用 jQuery 实现 Ajax
- 自定义错误页面
- 延迟加载视图
- 在 Flask 中使用 MongoKit
- 添加 Favicon
- 数据流
- 延迟请求回调
- 添加 HTTP Method Overrides
- 请求内容校验码
- 基于 Celery 的后台任务
- 部署选择
- mod_wsgi (Apache)
- 独立 WSGI 容器
- uWSGI
- FastCGI
- CGI
- 聚沙成塔
- API
- JSON 支持
- Flask 中的设计决策
- HTML/XHTML 常见问题
- 安全注意事项
- Flask 中的 Unicode
- Flask 扩展开发
- Pocoo 风格指引
- Python 3 支持
- 升级到最新版本
- Flask Changelog
- 许可证
- 术语表