Flask中的蓝本

蓝本:将程序某一部分的所有操作组织在一起。这个蓝本实例以及一系列注册在蓝本实例上的操作集合被称为一个蓝本。你可以把蓝本想象成模子,它描述了程序某一部分的细节,定义了相应的路由、错误处理器、上下文处理器、请求处理器等一系列操作。本身不能发挥作用,只有当你把它注册到程序上时,蓝本的操作才会附加到程序上。

使用蓝本可以将程序模块化,蓝本的具体表现形式是:为蓝本下的所有路由设置不同的URL前缀或子域名。

通俗解释:解决一个大型项目分团队开发的问题,主要是解决路由。使用蓝本可以避免端点值的重复冲突

1、创建蓝本

蓝本一般在子包中创建,比如创建一个blog子包,然后在构造文件中创建蓝本实例,使用包管理蓝本允许你设置蓝本独有的静态文件和模板,并在蓝本内对各类函数分模块存储。

from flask import Blueprint
admin_bp = Blueprint('admin', __name__)
在变量实例化名adminbp对象的名称后面添加一个" _bp“,为了更容易区分这是一个蓝本对象。

第一个参数是蓝本名称,第二个参数是包或模块名称

2、装配蓝本

即:蓝本可以注册哪些要求,以及其中的一些细节

(1)视图函数(使用.route()装饰器注册)

from flask import Blueprint
admin_bp = Blueprint('admin', __name__)
@auth_bp.route('/login', methods=['GET', 'POST'])
def login():
   ...

现在这个脚本就像一个完整的单脚本Flask程序。

(2)错误处理函数(使用errorhandler()装饰器注册)

可以捕捉访问蓝本中路由发生的错误,是一个全局错误处理器。

404、405错误仅会被全局错误处理函数捕捉,如区分蓝本URL下的404和405错误,在全局定义的404错误处理函数中使用request.path.startswith('<蓝本的URL前缀>')来判断请求的URL是否属于某个蓝本。

3)请求处理函数(使用beforerequest,after_request,teardown_request等装饰器注册

只有该蓝本中的视图函数对应的请求才会触发相应的请求处理函数

(4)模板上下文处理函数 (使用context_processor装饰器注册)

和请求钩子类似,

并不是所有程序实例提供的属性和方法都可以在蓝本上调用,大部分的属性和方法仍然需要通过程序实例获取。

3、注册蓝本

前面说过,可以把蓝本比喻成一个模子,为了让模子发挥作用,需要把蓝本注册到程序实例上。

from bluelog.blueprints.admin import admin_bp
...
app.registerblueprint(admin_bp)

蓝本使用Flask.register_blueprint()方法注册,必须 传入蓝本对象。

app.registerblueprint(admin_bp, url_prefix='/admin')
app.registerblueprint(admin_bp, subdomain='admin')

上面传入的两个参数分别是

url_prefix:为admin蓝本下视图的URL前添加一个/admin前缀,比如login视图函数在调用时,就会变成/admin/login
subdomain:可以为蓝本的路由设置子域名,这时访问http://admin.example.com/login的URL才会触发admin蓝本中的login视图

4、蓝本的路由端点

端点:URL规则和视图函数的中间媒介,在路由里,URL和视图函数不是直接映射的,而是通过端点作为中间媒介

其实用 

@route route 注册的路由也可以用

app.add_url_rule('/hello', 'say_hello', say_hello)

实现,其中第二个参数即端点,第三个参数是视图函数对象。

类似于:/hello(URL规则)-->sayhello(端点) -->say_hello(视图函数)

默认情况下,端点是视图函数的名称,也可显式的用endpoint参数改变它
@app.route('/hello', endpoint='give_greeting')
def say_hello():
    return 'Hello'

这时,路由的URL规则对应的端点值不再仅仅是视图函数名了,而是”蓝本 .视图函数名“的形式,使用 $ flask routes 可以查看程序注册的所有路由

为什么要使用端点呢? 使用端点可以实现蓝本的视图函数命名空间
使用蓝本,你可以在不同的蓝本中创建同名的视图函数,比如两个蓝本中都有一个index 视图,Flask在端点前添加蓝本的名称,扩展了端点的命名空间解决了视图函数的重名问题。正因为这样,一旦蓝本使得,我们就要对程序中所有的url_for()函数中的端点值进行修改,添加蓝本名来明确端点的归属。

如: url_for('admin.login)

端点简写方式,在蓝本内部可以使用”.视图函数名“的形式。如:”admin.login“,可以简写为”.login“

5、蓝本资源

有时程序不同蓝本的页面需要不同的样式,可以为蓝本定义独有的静态文件和模板,需要把蓝本模块升级为包,在构造函数中创建蓝本实例,并在蓝本包中创建静态文件夹static和模板文件夹templates。

(1)要使用蓝本独有的静态文件,你需要使用static_folder关键字指定蓝本的静态文件夹路径

auth_bp = Bluepring('auth', __name__, static_folder='static', static_url_path='/auth/static')

如在注册蓝本时定义了urlprefix参数,即URL前缀,那蓝本的静态文件路径会自动设置为”/蓝本前缀/static“,可省略static_url_path的定义

获取蓝本静态文件的URL:

url_for('admin.static', filename='style.css'

返回:admin/static/style.css

(2)要使用蓝本独有的模块文件,你需要使用template_folder关键字指定蓝本的模板文件夹路径,为避免全局模板中存在同名文件的冲突,通常会在蓝本的模板文件中以蓝本名称新建一个子文件夹存储模板,如 template/auth/index.html

猜你喜欢

转载自blog.csdn.net/c710473510/article/details/88934242