flask路由规划蓝图和route

引言:

  • 在写任何web项目的时候路由的配置永远都是不可或缺的,如django中的include方法flask中的Blueprint这些都是用于将多个application中的路由区别开来,如果你要使用restful风格,那么这种路由一定是必须做的,很多教程在编写代码会在每一个视图函数上面写清楚完整的路径,包括请求的参数、以及请求的方法,其实就是为了达到这样的目的
  • 在flask中当一个庞大的系统中有很多小模块,在分配路由的时候怎么处理呢?全部都堆到一个py程序中,调用@app.route? 显然这是很不明智的,因为当有几十个模块需要写路由的时候,这样程序员写着写着自己就晕掉了。同时也违背了面向对象设计原则中的控制反转原则。模块与模块之间应该不要太紧密的依赖,高级层级模块和低级层级的模块之间的依赖应该有一层抽象来实现。

Flask框架中,我们可以使用blueprint蓝图来解耦路由分配问题,实现不同业务模块之间的较为松散的依赖。

blueprint的实现
在相应的视图文件中编写
from flask import Blueprint

route_index = Blueprint(‘index_page‘,__name__)
@route_index.route(‘/‘)
def index():
    return ‘hello wrold‘
在主模块views.py文件中注册蓝图
from web.controllers.index import route_index #导入已经写好的蓝图
from application import app #导入app

app.register_blueprint(route_index,url_prefix = ‘/‘)

#第一个参数:表示注册的蓝图名
#第二个参数:表示访问的路径

#这样在使用该路由装饰器的时候可以避免写多余的重复的路径
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为必填参数,其余是可选参数,不填为None值
url_prefix:路由前缀
例如:想到达http://goods/article/first
在这个路由中goods是通用路由,是article板块的前缀
如果使用该路由设置的装饰器那么可以省略的只写article/first的内容

template_folder:模板文件夹
如果想从其他模块的模板文件夹中调度模板来使用,需要使用template_folder来指明模板的搜寻路径
同样的,static_folder与static_url_path的功能与template_folder类似

root_path:根目录的绝对路径,一般为工程项目的根目录路径

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的这个参数能够有效定义路由的具体功能,使一个路由更具体化,避免程序编写过程中随意的改动造成错误。
说人话就是url_defaults设置以后参数名只能是传入字典的键,以上面的例子来说如果没有设置url_defaults那么参数键值为任意整数均可,其他情况以此类推。
也就是说,一旦设定了这个参数值,那么这个路由的别名就定死了。

‘‘‘

  

关于route方法

 1 @app.route(‘/‘,‘index‘,index)
 2
 3 def index():
 4
 5    pass
 6
 7 #带引号的是endpoint,不带引号的index是路由函数名,必须要与下面定义的函数名相同
 8
 9 ‘‘‘
10
11 关于endpoint
12 endpoint相当于实际url的一个别名,在浏览器输入地址时,需要在flask后台寻找相应的路由函数(从而查找相应的资源),而在查找的过程中,不是直接用物理地址来进行硬编码的,而是通过映射成endpoint来查找。也就是说,开发者定义的每一个路由地址都有一个注册的endpoint与之对应。在客户端输入地址在后台查询资源的时候,通过这个endpoint来查找相应的路由函数。
13 ‘‘‘

深入理解Flask请求机制:

所有 Flask 程序都必须创建一个程序实例。 Web 服务器把接收来自客户端的所有请求路由都转交给这个实例对象处理。程序实例是 Flask 类的对象。 Flask 类的构造函数只有一个必须指定的参数,即程序主模块或包的名字,即我们经常用到的一条语句:app = Flask(name)。Python的 name 变量会存储这些值。

另外,Flask 用蓝图 blueprint来在一个应用中或跨应用制作应用组件和支持通用的模式。通过不同的 url_prefix ,从而使用户的请求到达不同模块的 view 函数。同时,有效分离了不同模块,使得开发过程更加的清晰。

app和蓝图blueprint还有许多类方法,像route()方法一样可以作为路由函数的装饰器,对每一次请求作更精细的判别和操作,在更高效地进行数据库配置和请求操作,以及处理错误请求方面有很大的作用。

例如:

before_first_request #第一次请求的处理

before_reqeust #注册一个函数来实现对每一个路由请求的拦截

after_request #每一次请求之后额处理

app_context #上下文环境

参考链接:

https://blog.csdn.net/qq_35020943/article/details/86919753

原文地址:https://www.cnblogs.com/pythonyeyu/p/11604514.html

时间: 2024-11-09 06:25:59

flask路由规划蓝图和route的相关文章

flask 路由规划(blueprint)

# 统一路由蓝牙规划 # file:blueprint_route.py from flask import Blueprint route_test = Blueprint("home",__name__) # 路由只有通过app注册后才生效 """ 统一路由规划的优点: 统一前缀 当网站结构复杂后可维护 """ @route_test.route("/") def home(): return &quo

Flask最强攻略 - 跟DragonFire学Flask - 第九篇 Flask 中的蓝图(BluePrint)

蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看客户列表的功能,后来你又加入了一个添加客户的功能(add_user)模块, 然后又加入了一个删除客户的功能(del_user)模块,然后又加入了一个修改客户的功能(up_user)模块,在这个系统中,就可以将 查看客户,修改客户,添加客户,删除客户的四个功能做成蓝图加入到客户管理系统中,本篇最后会做

flask中的蓝图与子域名实现

内容: 1.flask中的蓝图 2.flask子域名实现 1.flask中的蓝图 一个大型项目中视图比较多,如果仅仅是写在app.py中不方便管理,蓝图就可以做到分功能分目录结构 (1)什么是蓝图 蓝图:用于实现单个应用的视图.模板.静态文件的集合. 蓝图就是模块化处理的类 简单来说,蓝图就是一个存储操作路由映射方法的容器,主要用来实现客户端请求和URL相互关联的功能. 在Flask中,使用蓝图可以帮助我们实现模块化应用的功能. (2)蓝图的运行机制 蓝图是保存了一组将来可以在应用对象上执行的操

Flask初识,第九篇,Flask中的蓝图

蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看客户列表的功能,后来你又加入了一个添加客户的功能(add_user)模块, 然后又加入了一个删除客户的功能(del_user)模块,然后又加入了一个修改客户的功能(up_user)模块,在这个系统中,就可以将 查看客户,修改客户,添加客户,删除客户的四个功能做成蓝图加入到客户管理系统中,本篇最后会做

Flask中的蓝图(BluePrint)、

蓝图 1.初识Flask蓝图(BluePrint) 创建一个项目然后将目录结构做成: user.py中的内容 from flask import Blueprint, render_template # 导入Flask中的蓝图BluePrint模块 # 实例化一个蓝图对象 users_blue = Blueprint('users', __name__, template_folder='user_temp', url_prefix='/user') # 这里添加路由和视图函数的时候与在Flas

Flask中的蓝图

一.前言 蓝图,听起来高大上的一匹,在Flask中的蓝图 blueprint 也是一个非常高大上的东西,它的作用就是将功能与主服务分开 比如说,你有一个客户管理系统,最开始的时候,只有一个查看客户列表的功能,后来你又加入了一个添加客户的功能(add_user)模块, 然后又加入了一个删除客户的功能(del_user)模块,然后又加入了一个修改客户的功能(up_user)模块,在这个系统中,就可以将:查看客户,修改客户,添加客户,删除客户的四个功能做成蓝图加入到客户管理系统中,本篇最后会做一个这样

Flask 中的蓝图(BluePrint)

目录 1.Flask蓝图概述 2.一个简单的蓝图实现 2.1 实例一: 2.2 实例二: 3.蓝图实现学生信息的增删改查 3.1学生信息查看: 3.2学生信息更新: 3.3学生信息增加: 3.4管理学生信息的主服务器: 3.5管理学生信息的web视图: 1.Flask蓝图概述 作用就是将功能与主服务分开,蓝图没有run方法 比如说,你有一个客户管理系统,最开始的时候,只有一个查看客户列表的功能,后来你又加入了一个添加客户的功能(add_user)模块, 然后又加入了一个删除客户的功能(del_u

Flask - 路由

一. 路由和响应函数(View function)的映射是通过装饰器实现的 1. """ #装饰器: def wrapper(func): def inner(*args, **kwargs): return func(*args, **kwargs) return inner @wrapper 相当于 index = wrapper(index) def index(request): pass """ # app.route('path')将

【Flask路由系统】 -- 2019-08-11 19:11:52

目录 动态路由参数 路由参数 methods endpoint defaults strict_slashes redirect_to subdomain 原文: http://106.13.73.98/__/112/ @(Flask路由) *** 动态路由参数 三种用法 <int:xx> 要求输入的url必须是可转换为int类型的 <string:xx> 要求输入的url必须是可转换为String类型 <xx> 默认使用的是可转换为String类型的 开始测试 代码如