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 ...
随机推荐
- 锁对象-Lock: 同步问题更完美的处理方式 (ReentrantReadWriteLock读写锁的使用/源码分析)
Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我 ...
- Nastya Studies Informatics CodeForces - 992B(增长姿势)
有增长姿势了 如果a * b == lcm * gcd 那么a和b为lcm因数 这个我之前真不知道emm... #include <bits/stdc++.h> #define mem( ...
- 20165218 《网络对抗技术》Exp3 免杀原理与实践
Exp3 免杀原理与实践 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧 使用VirusTotal或 ...
- 如何使用android design support library
Android应用Design Support Library完全使用实例 - OPEN 开发经验库http://www.open-open.com/lib/view/open143338585611 ...
- IDA error of " positive sp value has been found"
问:用IDA静态分析,函数结尾出现 endp ; sp-analysis failed 用F5调不出伪代码,不知道是什么原因,请问有什么解决办法没有? 答:endp ; sp-analysis fai ...
- R语言 线性回归
0 引言 初学者,对于一些运行结果不是很清楚,所以看了一些课本和资料,这里做一个记录而已. 1 线性回归模型的结果分析 结果的解释: “call”:指出线性回归的公式 “Residuals”:之处从实 ...
- python中的zip
>>> a = zip([1,2,3],[34,35,36]) >>> print(a) <zip object at 0x0394D0F8> > ...
- Hadoop生态圈-hive优化手段-作业和查询优化
Hadoop生态圈-hive优化手段-作业和查询优化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- [LeetCode] 329. Longest Increasing Path in a Matrix ☆☆☆
Given an integer matrix, find the length of the longest increasing path. From each cell, you can eit ...
- Git之代码合并及分支管理
环境说明: 对于一个git项目而言,公司在gitlab上有对应的三个分支,以kazihuo项目为例说明,分别是development.master.testing,运维首先在gitlab上创建一个gr ...