Flask路由与蓝图Blueprint
需求分析:
当一个庞大的系统中有很多小模块,在分配路由的时候怎么处理呢?全部都堆到一个py程序中,调用@app.route? 显然这是很不明智的,因为当有几十个模块需要写路由的时候,这样程序员写着写着自己就晕掉了。同时也违背了面向对象设计原则中的控制反转原则。模块与模块之间应该不要太紧密的依赖,高级层级模块和低级层级的模块之间的依赖应该有一层抽象来实现。
Flask框架中,我们可以使用blueprint蓝图来解耦路由分配问题,实现不同业务模块之间的较为松散的依赖。
1. blueprint的实现过程
(1)在子模块views.py文件中定义蓝图
例如:为customer定义一个蓝图路由
customer = Blueprint('customer',__name__)
@customer.route()
def do_something():
pass
(2)在主模块views.py文件中注册蓝图
app.register_blueprint(customer,url_prefix='/customer')
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):
有两个是必须填写的参数:name和import name,其余参数都是选择性的
1. name:即路由的别名,在子模块中定义的蓝图要想通过在主模块中注册使用,就需要定义一个别名
2. import name:表示模块的系统变量,用来区别是子模块还是主模块,这里必须填__name__,表示是在子模块中定义
3. url_prefix:路由前缀
例如:想到达http://myblog/article/first
/artile 即是 first前缀
4. template_folder:模板文件夹
如果想从其他模块的模板文件夹中调度模板来使用,需要使用template_folder来指明模板的搜寻路径
同样的,static_folder与static_url_path的功能与template_folder类似
5. url_defaults :默认的路由路径别名,以字典的形式保存在Blueprint类实例中。
因为保存的形式是字典,所以这个参数的值比较特殊,一定是要含有两个参数的元组形式。
例如:url_defaults=([‘so’,’so’])
有一种参数形式的路由设定方式:
@customer.route(‘/<int : any>’)
def do_something(any):
pass
路由参数在客户端输入的值时不确定的,如上面规定的int即整型数(也可以是string类型或者不设定类型)。在定义路由函数的时候,必须作为形参传入。那么如果设定了url_defaluts,则这个形参的名称就固定了,不可以为其他。例如上面的例子:url_defaults=([‘so’,’so’]),那么,形参就必须为so,而不能是any了。显然,blueprint的这个参数能够有效定义路由的具体功能,使一个路由更具体化,避免程序编写过程中随意的改动造成错误。
也就是说,一旦设定了这个参数值,那么这个路由的别名就定死了。
6. root_path:根目录的绝对路径,一般为工程项目的根目录路径
2. 关于route方法
例子:
@app.route(‘ /’ ,’index’ , index)
def index():
pass
#带引号的是endpoint,不带引号的index是路由函数名,必须要与下面定义的函数名相同
route()其实是add_url_rule()方法的实例
@app.route(‘ /’ ,’index’,index)
等价于:app.add_url_rule(‘/’,’index’, index)
也可以这样定义endpoint:
app.view_functions[‘index’] = index
官方源码:
add_url_rule(rule,endpoint=None,view_func=None,provide_automatic_options=None, **options)
参数解析:
1. rule:在浏览器输入的地址格式
2. view_func:路由函数,即开发者定义的路由
If a view_func is provided it will be registered with the endpoint.
3. endpoint:路由函数的注册别名
关于endpoint
endpoint相当于实际url的一个别名,在浏览器输入地址时,需要在flask后台寻找相应的路由函数(从而查找相应的资源),而在查找的过程中,不是直接用物理地址来进行硬编码的,而是通过映射成endpoint来查找。也就是说,开发者定义的每一个路由地址都有一个注册的endpoint与之对应。在客户端输入地址在后台查询资源的时候,通过这个endpoint来查找相应的路由函数。
深入理解Flask请求机制:
所有 Flask 程序都必须创建一个程序实例。 Web 服务器把接收来自客户端的所有请求路由都转交给这个实例对象处理。程序实例是 Flask 类的对象。 Flask 类的构造函数只有一个必须指定的参数,即程序主模块或包的名字,即我们经常用到的一条语句:app = Flask(__name__)。Python的 __name__ 变量会存储这些值。
另外,Flask 用蓝图 blueprint来在一个应用中或跨应用制作应用组件和支持通用的模式。通过不同的 url_prefix ,从而使用户的请求到达不同模块的 view 函数。同时,有效分离了不同模块,使得开发过程更加的清晰。
app和蓝图blueprint还有许多类方法,像route()方法一样可以作为路由函数的装饰器,对每一次请求作更精细的判别和操作,在更高效地进行数据库配置和请求操作,以及处理错误请求方面有很大的作用。下篇文章我将会写一下这方面的内容。
参考阅读:官方文档http://flask.pocoo.org/docs/dev/api/#flask.Flask.add_url_rule
例如:
before_first_request #第一次请求的处理
before_reqeust #注册一个函数来实现对每一个路由请求的拦截
after_request #每一次请求之后额处理
app_context #上下文环境
Flask路由与蓝图Blueprint的更多相关文章
- python 全栈开发,Day120(路由系统, 实例化Flask的参数, 蓝图(BluePrint), before_request after_request)
昨日内容回顾 1.Flask: from flask import Flask app = Flask(__name__) # 从源码中可以看出,Flask集成的run方法是由werkzeug中的ru ...
- 第九篇 Flask 中的蓝图(BluePrint)
第九篇 Flask 中的蓝图(BluePrint) 蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? ...
- Flask最强攻略 - 跟DragonFire学Flask - 第九篇 Flask 中的蓝图(BluePrint)
蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看 ...
- 9,Flask 中的蓝图(BluePrint)
蓝图,听起来就是一个很宏伟的东西,在Flask中的蓝图 blueprint 也是非常宏伟的,它的作用就是将 功能 与 主服务 分开. 比如说,你有一个客户管理系统,最开始的时候,只有一个查看客户列表的 ...
- flask 第九篇 蓝图 Blueprint
蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看 ...
- Flask 中的蓝图(BluePrint)
蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开 怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查 ...
- day96:flask:flask-migrate&flask-session&蓝图Blueprint&蓝图的运行机制
目录 1.flask-migrate 2.flask-session 3.蓝图:Blueprint 4.蓝图的运行机制 1.数据库迁移:flask-migrate 1.Flask的数据库迁移 在开发过 ...
- flask中的蓝图 Blueprint
模块化 随着flask程序越来越复杂,我们需要对程序进行模块化的处理,之前学习过python的模块化管理,于是针对一个简单的flask程序进行模块化处理 简单来说,Blueprint 是一个存储操作方 ...
- Flask初学者:蓝图Blueprint
蓝图这个名字好像就是根据单词Blueprint字面意思来,跟平常我们理解的蓝图完全挂不上钩,这里蓝图就是指Blueprint. 使用蓝图的好处是可以将不同功能作用的视图函数/类视图放到不同的模块中,可 ...
随机推荐
- elasticsearch 摘要
看终于有人把Elasticsearch原理讲透了!, 后总结: 反向索引又叫倒排索引,是根据文章内容中的关键字建立索引. 搜索引擎原理就是建立反向索引 elasticsearch在Lucene的基础上 ...
- 微信小程序入门(三)
11.开发框架基本介绍 四个组成部分,其它三个前面介绍过了,主要WXS: WXS:对wxml增强的一种脚本语言,可以对请求的数据进行filter或者做计算处理,帮助wxml快速构建出页面结构. 12. ...
- solr7.3.1在CentOS7上的安装
1 solr的下载 从Solr官方网站(http://archive.apache.org/dist/lucene/solr/7.3.1/ )下载Solr最新版本, 根据Solr的运行环境,Linux ...
- 【杂谈】Remember-Me的实现
前言 此篇随笔记录了Remember-Me实现过程中出现的问题和解决方案,以及相关的思考. 正文 1. RememberMe是什么? RememberMe意为记住我,对应登录界面的那个勾选项.另一种说 ...
- 一致性Hash算法(分布式算法)
一致性哈希算法是分布式系统中常用的算法,为什么要用这个算法? 比如:一个分布式存储系统,要将数据存储到具体的节点(服务器)上, 在服务器数量不发生改变的情况下,如果采用普通的hash再对服务器总数量取 ...
- Perl子程序引用和匿名子程序
子程序也有引用,也有匿名子程序.假设你已经具备了数组.hash的引用知识,所以这里简单介绍一下. $ref_sub = \&mysub; # 子程序引用,&符号必须不能少 &{ ...
- 关于 Uboot 中有趣的 0xdeadbeef 填充
在 Uboot 的 Start.S 中存在以下源码: .globl _start _start: b start_code ldr pc, _undefined_instruction ldr pc, ...
- JavaScript 系列博客(六)
JavaScript 系列博客(六) 前言 本篇博客介绍 js 操作高级,通过 js 获取标签的全局属性.设置标签的全局属性,以及事件的绑定与取消.js 盒模型与 js 动画. 对象使用的高级 对象的 ...
- angularjs_百度地图API_根据经纬度定位_示例
百度API--Demo地址: http://lbsyun.baidu.com/jsdemo.htm#i8_4 本例是在angular.js使用的百度地图根据经纬度定位的API:(正常的页面写法基本 ...
- 创作型---原型模式(C# ICloneable接口的实现)
在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,可以通过对原来对象拷贝一份来完成创建,这样在内存中不需要创建多个相同的类实例,从而减少内存的消耗和达到类实例的 ...