热门标签 | 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参数既可以在蓝图实例化的时候设置,也可以在蓝图注册的参数中设置.

 



推荐阅读
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • 大家好,我是梅巴哥er。本文将深入探讨Redux框架中的第三个实战案例,具体实现每两秒自动点击按钮以触发颜色变化的功能。该案例中,一个关键点在于是否需要使用异步操作来处理定时任务,我们将详细分析其必要性和实现方式。通过这一实例,读者可以更好地理解Redux在实际项目中的应用及其异步处理机制。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
  • 本文介绍了如何利用Apache POI库高效读取Excel文件中的数据。通过实际测试,除了分数被转换为小数存储外,其他数据均能正确读取。若在使用过程中发现任何问题,请及时留言反馈,以便我们进行更新和改进。 ... [详细]
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
  • 本文详细探讨了Zebra路由软件中的线程机制及其实际应用。通过对Zebra线程模型的深入分析,揭示了其在高效处理网络路由任务中的关键作用。文章还介绍了线程同步与通信机制,以及如何通过优化线程管理提升系统性能。此外,结合具体应用场景,展示了Zebra线程机制在复杂网络环境下的优势和灵活性。 ... [详细]
  • 开发笔记:深入解析Android自定义控件——Button的72种变形技巧
    开发笔记:深入解析Android自定义控件——Button的72种变形技巧 ... [详细]
  • 如果程序使用Go语言编写并涉及单向或双向TLS认证,可能会遭受CPU拒绝服务攻击(DoS)。本文深入分析了CVE-2018-16875漏洞,探讨其成因、影响及防范措施,为开发者提供全面的安全指导。 ... [详细]
  • 在Java中,`Timer`类主要用于在指定时间或以固定周期执行任务。虽然它具备线程安全性,但并不保证实时性。此外,`Timer`支持使用守护线程来运行任务,Java中的线程分为用户线程和守护线程两种类型。用户线程通常用于执行应用程序的主要逻辑,而守护线程则用于支持程序的后台操作。通过合理配置`Timer`,可以实现高效的任务调度和管理。 ... [详细]
  • 在探讨C语言编程文本编辑器的最佳选择与专业推荐时,本文将引导读者构建一个基础的文本编辑器程序。该程序不仅能够打开并显示文本文件的内容及其路径,还集成了菜单和工具栏功能,为用户提供更加便捷的操作体验。通过本案例的学习,读者可以深入了解文本编辑器的核心实现机制。 ... [详细]
  • Java集合框架特性详解与开发实践笔记
    Java集合框架特性详解与开发实践笔记 ... [详细]
  • 深入解析微信小程序开发中的全局配置文件设置与优化技巧
    本文深入探讨了微信小程序开发中全局配置文件的设置与优化技巧,详细解析了 `app.js`、`app.json`、`app.wxss` 和 `project.config.json` 的功能与最佳实践。通过合理配置这些文件,开发者可以显著提升小程序的性能和用户体验。文章还介绍了如何利用这些配置文件进行模块化开发和调试,帮助开发者更好地管理和维护小程序项目。 ... [详细]
  • ROS主机与从机之间的通信原理及机制分析
    本文深入探讨了ROS(Robot Operating System)主机与从机之间的通信原理及机制。通过分析ROS网络架构,详细阐述了节点间的通信方式、消息传递流程以及数据同步机制。此外,还介绍了ROS中常用的通信模式,如发布/订阅、服务调用和参数服务器,为开发者提供了全面的技术指导。 ... [详细]
  • Java中处理NullPointerException:getStackTrace()方法详解与实例代码 ... [详细]
  • Java Web开发中的JSP:三大指令、九大隐式对象与动作标签详解
    在Java Web开发中,JSP(Java Server Pages)是一种重要的技术,用于构建动态网页。本文详细介绍了JSP的三大指令、九大隐式对象以及动作标签。三大指令包括页面指令、包含指令和标签库指令,它们分别用于设置页面属性、引入其他文件和定义自定义标签。九大隐式对象则涵盖了请求、响应、会话、应用上下文等关键组件,为开发者提供了便捷的操作接口。动作标签则通过预定义的动作来简化页面逻辑,提高开发效率。这些内容对于理解和掌握JSP技术具有重要意义。 ... [详细]
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社区 版权所有