flask基础之蓝图的使用(七)
前言
关于蓝图是什么?或为什么使用蓝图的详细介绍,官方文档讲的很详细,不再赘述。简单来说,在大型的应用中,我们不想视图函数显得杂乱无章,难以维护,将众多的视图函数按照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基础之蓝图的使用(七)的更多相关文章
- 第二篇 Flask基础篇之(闪现,蓝图,请求扩展,中间件)
本篇主要内容: 闪现 请求扩展 中间件 蓝图 写装饰器,常用 functools模块,帮助设置函数的元信息 import functools def wrapper(func): @functools ...
- Flask【第2篇】:Flask基础
Flask基础 知识点回顾 1.flask依赖wsgi,实现wsgi的模块:wsgiref,werkzeug,uwsgi 2.实例化Flask对象,里面是有参数的 app = Flask(__name ...
- python 全栈开发,Day120(路由系统, 实例化Flask的参数, 蓝图(BluePrint), before_request after_request)
昨日内容回顾 1.Flask: from flask import Flask app = Flask(__name__) # 从源码中可以看出,Flask集成的run方法是由werkzeug中的ru ...
- flask基础之AppContext应用上下文和RequestContext请求上下文(六)
前言 应用上下文和请求上下文存在的目的,官方文档讲的很清楚,可参考: http://www.pythondoc.com/flask/appcontext.html 应用上下文对象在没有请求的时候是可以 ...
- flask基础之请求处理核心机制(五)
前言 总结一下flask框架的请求处理流程. 系列文章 flask基础之安装和使用入门(一) flask基础之jijia2模板使用基础(二) flask基础之jijia2模板语言进阶(三) flask ...
- flask基础之app初始化(四)
前言 flask的核心对象是Flask,它定义了flask框架对于http请求的整个处理逻辑.随着服务器被启动,app被创建并初始化,那么具体的过程是这样的呢? 系列文章 flask基础之安装和使用入 ...
- flask中的蓝图实现模块化的应用
Blueprint 蓝图的基本设想是当它们注册到应用上时,它们记录将会被执行的操作. 当分派请求和生成从一个端点到另一个的 URL 时,Flask 会关联蓝图中的视图函数. 简单来说,Blueprin ...
- Flask基础总结
Flask 基础总结 .Flask优点: 拥有强大的第三方组件小而精非常全面,不足就是更新太快 .Flask中的三剑客: HTTPRespone redierct render_template .F ...
- Flask 中的蓝图
相当与django中的App 基础模板 1.初识Flask蓝图(blueprint) 创建一个项目然后将目录结构做成: s_view.py 文件中的内容 from flask import Blu ...
随机推荐
- BZOJ3158 千钧一发(最小割)
可以看做一些物品中某些互相排斥求最大价值.如果这是个二分图的话,就很容易用最小割了. 观察其给出的条件间是否有什么联系.如果两个数都是偶数,显然满足条件二:而若都是奇数,则满足条件一,因为式子列出来发 ...
- XOR and Favorite Number CodeForces - 617E(前缀异或+莫队)
题意原文地址:https://blog.csdn.net/chenzhenyu123456/article/details/50574169 题意:有n个数和m次查询,每次查询区间[l, r]问满足a ...
- 【转载】dfs序七个经典问题
作者:weeping 出处:www.cnblogs.com/weeping/ 原文链接 https://www.cnblogs.com/weeping/p/6847112.html 参考自:<数 ...
- Android O 正式版新功能
ref: Android O新特性和行为变更总结zzhttp://www.cnblogs.com/bluestorm/p/7148134.html Android O正式版带来了诸多新功能,如Tens ...
- bzoj3672: [Noi2014]购票(树形DP+斜率优化+可持久化凸包)
这题的加强版,多了一个$l_i$的限制,少了一个$p_i$的单调性,难了好多... 首先有方程$f(i)=min\{f(j)+(dep_i-dep_j)*p_i+q_i\}$ $\frac {f(j) ...
- php 百家姓
private $surname = array('赵','钱','孙','李','周','吴','郑','王','冯','陈','褚','卫','蒋','沈','韩','杨','朱','秦','尤' ...
- C#线程篇---你所不知道的线程池(4)
线程的创建和销毁都要耗费大量的时间,有什么更好的办法?用线程池! 太多的线程浪费内存资源,有什么更好的办法?用线程池! 太多线程有损性能,有什么更好的办法?用线程池!(⊙_⊙)? 线程池是什么?继前三 ...
- python3 安装MySQLdb及无法打开mysql.h问题解决(win7 )
在Flask中要连接mysql数据库,需要安装flask-mysqldb. pip install flask-mysqldb 用pip安装MySQLdb 中遇到如下问题,折腾半天之久,多方尝试,终搞 ...
- github怎么绑定自己的域名
本文前提是你已经搭建好了博客. CAST: 1 没有域名的话先去申请一个域名 如果想简单省心,不计较时间和金钱的话,那就阿里云或腾讯云买全套大宝剑(服务器+域名+解析). 因为本人不想备案(时间长), ...
- linux网络编程框架
OSI七层模型与TCP四层模型 OSI七层模型与TCP四层模型 BS和CS服务器架构 (1)CS架构介绍(client server,客户端服务器架构)(2)BS架构介绍(broswer server ...