用蓝图实现模块化应用

官方文档笔记

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

 

posted @ 2018-09-14 21:35  铁树小寒  阅读(447)  评论(0编辑  收藏  举报