热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pythonFlask03Flask路由系统和蓝图(Blueprint)

Flask中的路由系统其实我们并不陌生了,例如下面的路由从一开始到现在都一直在应用app.route(,methods[GET,POST])Flask中除了这种直接路

Flask中的路由系统其实我们并不陌生了, 例如下面的路由从一开始到现在都一直在应用

@app.route("/",methods=["GET","POST"])

 

Flask中除了这种直接路由方法外, 还有一种蓝图路由方法,可以更好的规划路由.


路由设置方法

Flask中的路由设置方法有直接路由法和蓝图路由法两种方法.


直接路由法


methods

methods 指定视图函数的请求方式,默认GET


endpoint

endpoint可以解决自定义装饰器导致的视图函数的重名问题



示例: 如下程序视图函数"detail"和"index"都用到了自定义装饰器wai, 因此运行过程中两个视图函数都被改名为wai导致了程序出错. 而endpoint可以重新定义视图函数名,从而又改正视图函数名. 


from flask import Flask, request, session, redirect, render_template
app = Flask(__name__, template_folder='templates')
app.secret_key = 'my_secret_key'
# 装饰器函数
def wai(func):
def inner(*args, **kwargs):
if session.get('user'):
ret = func(*args, **kwargs)
return ret
else:
return redirect('/login')
return inner
@app.route('/', endpoint='index')
@wai # 会把函数index当成wai中的inner
def index(nid):
return render_template('index.html')
@app.route('/login', methods=('GET', 'POST'), strict_slashes=False)
def login():
if request.method == 'GET':
return render_template('login.html')
else:
session['user'] = request.form.get('user')
return redirect('/')
@app.route('/detail', endpoint='detail')
@wai
def detail():
return render_template('detail.html')
if __name__ == '__main__':
app.run(debug=True)


关于视图函数中的url补充问题:


  • flask允许两个路由访问同一个视图函数。操作方法如下:

@app.route("/index")
@app.route("/default")
def index():
return "Hello!!"

  • 路由route("/index")和 route("/index/")的区别
    • route("/index/")在访问时浏览器地址可以是否输入最后的"/"都可以访问
    • route("/index")在访问时浏览器地址输入最后的"/"都不可以访问

url_for 

url_for 反向获取路由地址



from flask import Flask, url_for
app = Flask(__name__)
@app.route("/", endpoint="index1", )
def index():
print(url_for("index1")) # url_for用于反向生成路由地址
print(url_for(endpoint="index1"))
return "hahha!"
app.run(debug=True)

运行结果:




动态路由参数


        /  / / 参数添加在路由中后,视图函数中需要有参数接收动态路由参数,此时访问url为 "url/动态参数"


  •   动态参数只能为int型
  • 动态参数为字符串
  •   动态参数为字符串


程序示例:


原本url为 http://127.0.0.1:5000/


现在url应该使用为:  http://127.0.0.1:5000/124即可访问页面, "124"也可以随便为其他字符串.


@app.route('/', endpoint='index')
@wai # 会把函数index当成wai中的inner
def index(nid):
return render_template('index.html')

如果index函数中没写参数nid, 访问会报错如下:





defaults

     defaults={"nid":1} 指定视图函数的默认参数



strict_slashes

参数strict_slashes决定访问url时是否严格遵循路由规则. 以示例地址http://127.0.0.1:5000/login为例


  • strict_slashes=True 严格遵循路由规则 , 不可以访问到/login/, 只能访问到/login
  • strict_slashes=False 不严格遵循路由规则, 可以访问 /login/, 可以访问到/login


@app.route('/login', methods=('GET', 'POST'), strict_slashes=False)
def login():
if request.method == 'GET':
return render_template('login.html')
else:
session['user'] = request.form.get('user')
return redirect('/')


redirect_to

 redirect_to="/login" 永久跳转地址 301

例如当网站有新地址后,可以给老地址加"redirect_to"使其跳转到新地址.


加蓝图路由法

蓝图路由法相比于直接路由法最大的优点是可以很好的按模块规划路由



蓝图可以设置自己的"template_folder", 但是不要和其他的html文件重名


蓝图路由参数"url_prefix"既可以在蓝图实例化设置也可以在蓝图注册时设置.




程序示例: 



 运行结果:





蓝图Blueprint详解

蓝图,听起来就是一个很宏伟的东西

在Flask中的蓝图 blueprint 也是非常宏伟的

它的作用就是将 功能 与 主服务 分开,即功能隔离,怎么理解呢?

比如说,你有一个客户管理系统,最开始的时候,只有一个查看客户列表的功能,后来你又加入了一个添加客户的功能(add_user)模块, 然后又加入了一个删除客户的功能(del_user)模块,然后又加入了一个修改客户的功能(up_user)模块,在这个系统中,就可以将查看客户、修改客户、添加客户、删除客户的四个功能做成蓝图加入到客户管理系统中,本篇最后会做一个这样的例子,但是首先我们要搞清楚什么是蓝图 blueprint。

进一步学习  >>> 点击


蓝图示例

使用步骤


  1. 实例化路由以及配置路由参数
  2. 导入路由并且注册路由
  3. 访问


程序示例:



程序运行后:


 



 


蓝图实例参数

通过以上的例子, 我们如何理解蓝图呢?

其实我们可以理解成一个没有run方法的Flask对象, 只要Blueprint被 Flask 注册了,就一定会生效. 这个理论虽然有很多的漏洞, 但是对于刚接触蓝图的你来说, 就这么样理解比较简单.


  • # 每个蓝图都可以为自己独立出一套template模板文件夹,如果不写则共享项目目录中的templates
  • # 静态文件目录也是可以独立出来的

from flask import Blueprint # 导入 Flask 中的蓝图 Blueprint 模块
from flask import render_template
sv = Blueprint("sv",
__name__,
template_folder="sv_template", # 每个蓝图都可以为自己独立出一套template模板文件夹,如果不写则共享项目目录中的templates
static_folder="sv_static", # 静态文件目录也是可以独立出来的
url_prefix="/user" # 路径规划,可以让本蓝图的路径都在"/user"下,避免url重复
) # 实例化一个蓝图(Blueprint)对象
@sv.route("/svlist")
def view_list():
return render_template("svlist.html")

注意!!!!!!!!!!!!!!!!!!    


  • 蓝图内部的视图函数及route如果出现重复的url, 则优先使用外部url.  因此项目中需要用到url_prefix参数规划蓝图路径
  • 蓝图涉及的url_prefix参数既可以在蓝图实例化的时候设置,也可以在蓝图注册的参数中设置.

 



推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
author-avatar
Belief
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有