用蓝图实现模块化应用
官方文档笔记
http://www.pythondoc.com/flask/blueprints.html
一个blueprint对象和flask应用对象的工作方式很像,但他确实不是一个应用。
而是一个描述如何构建或扩展应用的蓝图。
1.为什么用蓝图?
flask中蓝图旨在针对以下情况:
- 把一个应用分解成一系列蓝图。
- 以一个URL前缀在一个应用上注册蓝图。
- 在一个应用中用不同的URL规则多次注册一个蓝图。(不理解)
- 通过蓝图提供模板过滤器、静态文件、模板和其他功能。一个蓝图不一定要实现应用或视图函数。
flask蓝图不是即插应用,因为他实际上并不是一个应用。
蓝图作为flask层提供分割的替代,共享应用配置,(如果使用多个应用对象,则应用会有分开的配置)并且可以更改所注册的应用对象。
其短板是你不能再应用创建后撤销一个蓝图而不销毁整个应用对象。
2.蓝图的概念
可以初步理解为单独路由起始路径的子模块。(但是实际上并不是这样)
3.第一个蓝图
from flask import Blueprint, render_template, abort
from jinja2 import TemplateNotFound
simple_page=Blueprint('simple_page',__name__',template_folder='templates')
@simple_page.route('/', defaults={'page': 'index'})
@simple_page.route('/<page>')
def show(page):
try:
return render_template('pages/%s.html' % page)
except TemplateNotFound:
abort(404)
当以后在应用中注册蓝图时,这个函数会被注册到应用中。
此外,他会给函数名加上由blueprint的构造函数中给出的 蓝图的名称 作为前缀。
4.注册蓝图
app.register_blueprint(simple_page)
# 将蓝图挂载到不同的位置上
app.register_blueprint(simple_page, url_prefix='/pages')
注:可以使用app对象的url_map方法查看路由规则。
5.蓝图资源
1.蓝图资源文件夹
与常规应用一样,蓝图被认为是包含在一个文件夹中。
虽然多个蓝图可以源自相同的文件夹中,它并不必须是这种情况并且通常不建议这样做。
2.静态文件
一个蓝图可以通过static_folder关键字参数提供一个指向文件系统上文件夹的路径,来公开一个带有静态文件的文件夹。
这可以是一个绝对路径,也可以是相对于蓝图文件夹的路径。
admin = Blueprint('admin', __name__, static_folder='static')
蓝图为/admin把静态文件夹注册到/admin/static。
生成蓝图静态文件的url,类似于应用的静态文件夹所做的那样:
url_for('admin.static', filename='style.css')
3.模板
如果你想要蓝图公开模板,你可以提供blueprint构造函数中template_folder参数来实现
admin=Blueprint('admin',__main__, template_folder='templates')
像对待静态文件一样,路径可以是绝对的或是相对蓝图资源文件夹的。
模板文件夹会被加入到模板的搜索路径中,但是比实际的应用模板优先级低。
那么当你有一个 yourapplication/admin
文件夹中的蓝图并且你想要渲染 'admin/index.html'
模板, 且你已经提供了 templates
作为 template_folder ,你需要这样创建文件: yourapplication/admin/templates/admin/index.html
。
总感觉有点别扭。
6.构建URLs
推荐使用全称
# 蓝图名称和一个点作为前缀,可以构建到蓝图中视图函数的链接。 url_for('admin.index') # 单独一个点作为前缀,只适用于在同一个蓝图内的视图函数。 url_for('.index')
最后我考虑加上一个能运行的最小化附带蓝图实例。
对于templates_folder参数这部分一定要注意。
如果不赋值,模板应该统一放在应用templates目录下,即yourapplication/templates目录下。
如果赋值为templates/admin,则应该在该蓝图下创建文件: yourapplication/admin/templates/admin/index.html
。