发布于 2015-08-24 16:04:56 | 376 次阅读 | 评论: 0 | 来源: 网络整理
如果你已经在应用中使用了包和蓝图( 使用蓝图的模块化应用 ),那么还有许多方法可以更 进一步地改进你的应用。常用的方案是导入蓝图后创建应用对象,但是如果在一个函数中 创建对象,那么就可以创建多个实例。
那么这样做有什么用呢?
那么如何做呢?
方法是在一个函数中设置应用,具体如下:
def create_app(config_filename): app = Flask(__name__) app.config.from_pyfile(config_filename) from yourapplication.model import db db.init_app(app) from yourapplication.views.admin import admin from yourapplication.views.frontend import frontend app.register_blueprint(admin) app.register_blueprint(frontend) return app
这个方法的缺点是在导入时无法在蓝图中使用应用对象。但是你可以在一个请求中使用它。 如何通过配置来访问应用?使用 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'])
这里我们在配置中查找模板的名称。
扩展对象初始化时不会绑定到一个应用,应用可以使用 db.init_app
来设置扩展。 扩展对象中不会储存特定应用的状态,因此一个扩展可以被多个应用使用。关于扩展设计 的更多信息请参阅 Flask 扩展开发 。
当使用 Flask-SQLAlchemy 时,你的 model.py 可能是这样的:
from flask.ext.sqlalchemy import SQLAlchemy # no app object passed! Instead we use use db.init_app in the factory. db = SQLAlchemy() # create some models
因此,要使用这样的应用就必须先创建它。下面是一个运行应用的示例 run.py 文件:
from yourapplication import create_app app = create_app('/path/to/config.cfg') app.run()
上面的工厂函数还不是足够好,可以改进的地方主要有以下几点: