前言

关于蓝图是什么?或为什么使用蓝图的详细介绍,官方文档讲的很详细,不再赘述。简单来说,在大型的应用中,我们不想视图函数显得杂乱无章,难以维护,将众多的视图函数按照Api的设计规则进行切割是一个好方法。

蓝图的简单使用

  • 第一步:创建蓝图
# testblue.py
from flask import Blueprint
testblue = Blueprint('blue', __name__)
@testblue.route('/index')
def index():
return 'OK'
  • 第二步:注册蓝图
# __init__.py
from testblue import testblue
app = Flask(__name__,template_folder='static/html')
app.register_blueprint(testblue, url_prefix='/testblue')
if __name__ == "__main__":
app.run()

现在通过访问http://127.0.0.1:5000/testblue/index就可以访问到蓝图定义的api。

蓝图和应用的关系

蓝图的实现方式和应用十分相似,有着和app类似的运行机制,但它又不是一个应用,可以这样说,app对象管理着多个蓝图,多个蓝图共享app的配置文件,只有在app中注册过的蓝图才会起作用,否则无效;app调用register_blueprint注册蓝图,原理是:

# 源码
def register_blueprint(self, blueprint, **options):
first_registration = False
if blueprint.name in self.blueprints:
...
else:
self.blueprints[blueprint.name] = blueprint
self._blueprint_order.append(blueprint)
first_registration = True
blueprint.register(self, options, first_registration) # 参数
blueprint:蓝图对象
url_prefix:url前缀,即统一在该蓝图的所有的url前面添加一个前缀;默认为空;
subdomain:设置蓝图应该激活的的子域,默认为空;

说明

  • 首先,app通过blueprints字典收集管理所有的蓝图,_blueprint_order属性列表存储所有的蓝图对象;

  • 蓝图对象blueprint调用register方法,会将蓝图下的所有视图函数添加到app的view_functions属性中,所有的Rule添加到APP的url_map属性中;

Blueprint对象分析

  • Blueprint的初始化
def __init__(self, name, import_name, static_folder=None,
static_url_path=None, template_folder=None,
url_prefix=None, subdomain=None, url_defaults=None,
root_path=None):
pass # 参数
name:设置蓝图的名字,这个名字是蓝图的标识,用来区分多个蓝图的不同;
import_name:指定蓝图的资源文件夹,也就是蓝图的位置,该参数是模块的名字
root_path:指定蓝图的资源文件夹的绝对路径,如果这个不是None,import_name的设置失效;
static_folder:指定静态文件的路径,相对路径是相对于root_path;
static_url_path:静态文件的url;
template_folder:模板的路径;
url_prefix:url的前缀,如果在蓝图注册的时候也设置了该参数,那会使用注册时的参数;
subdomain:蓝图激活的子域;
url_defaults:默认的路径参数和其对应的值的键值对,当其被设置后,本蓝图的所有视图函数便拥有该参数
from flask import Blueprint
testblue = Blueprint('blue', __name__, url_defaults={'name':'cai'})
@testblue.route('/index')
def index(name):
print(name) # 拥有了默认的参数name
return 'OK'
  • 重要的方法
Blueprint.add_url_rule:往app中注册视图函数和路由规则;
Blueprint.endpoint:装饰器,直接往app的view_funcs添加视图函数;
Blueprint.before_request:装饰器,装饰的方法本蓝图的每个请求调用视图函数前执行
Blueprint.before_app_request:装饰器,装饰的方法app所有请求调用视图函数前执行,但如果对应的蓝图有自己的before_request装饰方法则执行自己的
Blueprint.before_app_first_request:装饰器,装饰的方法app所有请求第一次调用视图函数前执行;
Blueprint.after_request:装饰器,装饰的方法本蓝图的每个请求调用视图函数后执行,如果对应的app有全局的after_request装饰方法则执行全局的
Blueprint.after_app_request:装饰器,装饰的方法app所有请求调用视图函数后执行
Blueprint.teardown_request:装饰器,装饰的方法本蓝图的视图函数是否有异常都会执行;
Blueprint.teardown_app_request:装饰器,装饰的方法app所有视图函数是否有异常都会执行,但如果蓝图自己定义了则执行蓝图本身的
Blueprint.app_errorhandler:装饰器,自定义app的所有的http请求的标准错误处理;
Blueprint.errorhandler:装饰器,自定义本蓝图的所有http请求的标准错误处理
Blueprint.url_value_preprocessor:装饰器,定义本蓝图所有的请求的url预处理
Blueprint.url_defaults:装饰器,在app的url_default_functions中添加本蓝图的url生成的处理函数
Blueprint.app_url_value_preprocessor:装饰器,定义app所有的请求的url预处理,如果蓝图有自己的预处理则使用蓝图本身的
Blueprint.app_url_defaults:装饰器,在app的url_default_functions中添加app所有的url生成的处理函数,在调用url_for时会被调用
Blueprint.register_error_handler:方法,手动添加蓝图的标准错误处理

参考

flask基础之蓝图的使用(七)的更多相关文章

  1. 第二篇 Flask基础篇之(闪现,蓝图,请求扩展,中间件)

    本篇主要内容: 闪现 请求扩展 中间件 蓝图 写装饰器,常用 functools模块,帮助设置函数的元信息 import functools def wrapper(func): @functools ...

  2. Flask【第2篇】:Flask基础

    Flask基础 知识点回顾 1.flask依赖wsgi,实现wsgi的模块:wsgiref,werkzeug,uwsgi 2.实例化Flask对象,里面是有参数的 app = Flask(__name ...

  3. python 全栈开发,Day120(路由系统, 实例化Flask的参数, 蓝图(BluePrint), before_request after_request)

    昨日内容回顾 1.Flask: from flask import Flask app = Flask(__name__) # 从源码中可以看出,Flask集成的run方法是由werkzeug中的ru ...

  4. flask基础之AppContext应用上下文和RequestContext请求上下文(六)

    前言 应用上下文和请求上下文存在的目的,官方文档讲的很清楚,可参考: http://www.pythondoc.com/flask/appcontext.html 应用上下文对象在没有请求的时候是可以 ...

  5. flask基础之请求处理核心机制(五)

    前言 总结一下flask框架的请求处理流程. 系列文章 flask基础之安装和使用入门(一) flask基础之jijia2模板使用基础(二) flask基础之jijia2模板语言进阶(三) flask ...

  6. flask基础之app初始化(四)

    前言 flask的核心对象是Flask,它定义了flask框架对于http请求的整个处理逻辑.随着服务器被启动,app被创建并初始化,那么具体的过程是这样的呢? 系列文章 flask基础之安装和使用入 ...

  7. flask中的蓝图实现模块化的应用

    Blueprint 蓝图的基本设想是当它们注册到应用上时,它们记录将会被执行的操作. 当分派请求和生成从一个端点到另一个的 URL 时,Flask 会关联蓝图中的视图函数. 简单来说,Blueprin ...

  8. Flask基础总结

    Flask 基础总结 .Flask优点: 拥有强大的第三方组件小而精非常全面,不足就是更新太快 .Flask中的三剑客: HTTPRespone redierct render_template .F ...

  9. Flask 中的蓝图

    相当与django中的App 基础模板 1.初识Flask蓝图(blueprint) 创建一个项目然后将目录结构做成: s_view.py 文件中的内容   from flask import Blu ...

随机推荐

  1. 01.基于IDEA+Spring+Maven搭建测试项目--综述

    目前公司的测试工作中常见两种接口:HTTP和Dubbo,这两种接口类型均可以使用相关测试工具进行测试,但都会有一定的局限性和不便之处,具体如下: 1.HTTP接口,当需要对于参数进行加密解密时,就得对 ...

  2. Codeforces Round #250 (Div. 1) D. The Child and Sequence(线段树)

    D. The Child and Sequence time limit per test 4 seconds memory limit per test 256 megabytes input st ...

  3. 【刷题】BZOJ 3994 [SDOI2015]约数个数和

    Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M. Output T ...

  4. 【刷题】BZOJ 3529 [Sdoi2014]数表

    Description 有一张n×m的数表,其第i行第j列(1<=i<=n,1<=j<=m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. In ...

  5. 【刷题】洛谷 P3455 [POI2007]ZAP-Queries

    题目描述 Byteasar the Cryptographer works on breaking the code of BSA (Byteotian Security Agency). He ha ...

  6. 【ActiveMQ】- 发布/订阅模式

    publish/subscribe 特点:A发送的消息可以被所有监听A的对象的接收,就好比学校的广播,所有的学生都可以收听校园广播信息. 消息生产者: package com.zhiwei.advan ...

  7. keepalived回顾

    Keepalived是lvs的扩展项目,因此它们之间具备良好的兼容性. 通过对服务器池对象的健康检查,实现对失效机器/服务的故障隔离: 负载均衡器之间的失败切换failover,通过VRRPv2 st ...

  8. 单点登录(四)-----遇到问题-----cas server 源码部署tomcat运行报错ClassNotFoundException: org.jasig.cas.CasEnvironmentCo

    情况 cas单点登录 cas server 源码部署tomcat运行报错 把cas server的代码下载下来后使用gradle插件或者maven插件以及转化成eclipse·后导入发现部署到tomc ...

  9. Error:Could not find com.github.dcendents:android-maven-plugin:1.5.

    问题: Error:Could not find com.github.dcendents:android-maven-plugin:1.5.Searched in the following loc ...

  10. STM32 ------ HardFault_Hander 中断函数

    1.数组越界(对数组赋值) 正常情况,数组越界会进入 HardFault_Hander 中断函数的无线循环. 避免数组越界的一个方法是:每次使用数组前,检查要放入数据的数据长度是否大于数组长度,大于则 ...