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

 



推荐阅读
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 华为USG基于源地址的多出口策略路由配置
    网络拓扑如下:组网情况:企业用户主要有技术部(VLAN10)和行政部(VLAN20),通过汇聚交换机连接到USG。企业分别通过两个不同运营商(ISP1和ISP2)连接到 ... [详细]
  • 本文将详细探讨Linux pinctrl子系统的各个关键数据结构,帮助读者深入了解其内部机制。通过分析这些数据结构及其相互关系,我们将进一步理解pinctrl子系统的工作原理和设计思路。 ... [详细]
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社区 版权所有