Flask_路由(二)
一、路由规则设置说明
flask框架使用route()装饰器配置路由。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "hello flask_url"
路径分隔符
在URL路径中,“/”被用作路径分隔符。当它被写在URL路径的开头时,则表明本路径是一个绝对路径。当它被写在路径中间时 ,它被用作隔离路径的层级。那么,当它被写在最后时,它的作用又是什么呢?
# 路径分隔符
@app.route("/hi1")
def hi_1():
return "hi1" @app.route("/hi2/")
def hi_2():
return "hi2"
第1个路径没有“/”分隔符,它看上去更像是一个文件名;第2个路径的最后有“/”分隔符,它看上去更像是一个目录。两种方式对它们的访问效果可是有很大不同的:有“/”作为结尾的路径除了可以接受对其本身的访问,也可以接受相同路径前缀但不带“/”结尾的路径访问;而不带“/”结尾的路径样式则没有此效果。下面我们以表格的形式来呈现给大家看,看完你就会一目了然。

请求方式限定
使用 methods 参数指定可接受的请求方式,可以是多种。
# 使用methods限定访问视图的方式。
@app.route("/post_only", methods=["POST"]) # 只允许post方式访问视图
def post_only():
return "post_only"
路由查找方式
路由采用至上而下的查找方式。同一路由指向两个不同的函数,在匹配上第一个路由后就会停止查找。
@app.route("/")
def index():
return "hello flask url"
@app.route("/")
def index2():
return "hello flask url 2"

但是相同路由若使用了不同的请求限定方式,则会匹配对应的请求方式
# 当存在相同路径的路由时,根据请求方式区别视图
@app.route("/hello", methods=["POST"])
def hello1():
return "hello1" @app.route("/hello", methods=["GET"])
def hello2():
return "hello2"

一个视图可以配置多个路由
@app.route("/route1")
@app.route("/route2")
def double_route():
return "double_route"

重定向
在 redirect 方法中传入对应的url路径可实现重定向。
from flask import redirect
@app.route("/login")
def login():
url = "/hello"
return redirect(url)
url路径也可以使用url_for方法通过视图函数名获取。
from flask import url_for
@app.route("/hello", methods=["GET"])
def hello2():
return "hello2"
# 重定向
@app.route("/login")
def login():
# url = "/hello"
# 使用url_for方法可以通过视图函数名找到对应的url路径
# url = url_for("hello2", key1=value1, key2=value2) # 若视图函数需要传入参数,则直接以键值的方式传入即可。
url = url_for("hello2")
return redirect(url)

二、转换器
转换器的本质是通过正则表达式匹配路由地址。
flask 系统自带的转换器如下:
- string:UnicodeConverter, 接受任何不包含斜杠的文本,语法是 <string:参数名>。若不指定转换器类型,比如 <参数名>,flask默认使用该转换器。
- any:AnyConverter, 接受给定的枚举值,语法是 <any(可选1,可选2...):参数名>,小括号列出匹配的枚举值,枚举值只能是字符串。
- path:PathConverter, 类似 string ,但可以包含斜杠,语法是 <path:参数名>。
- int:IntegerConverter, 接受正整数,语法是 <int:参数名>。
- float:FloatConverter, 接受正浮点数,语法是 <float:参数名>。
- uuid:UUIDConverter, 接受 UUID 字符串,语法是 <uuid:参数名>。
当在路由中使用了转换器,若用户的输入满足转换器匹配规则,则响应200,反之,则响应404。
# 匹配数字
@app.route("/call/tel/1/<int:mobile>")
def call_tel_1(mobile):
return F"call tel {mobile}"

自定义转换器
flask的路由都是基于 werkzeug 函数库中的转换器实现的。
当我们自定义转换器的时候的有以下步骤:
- 导入转换器基类(BaseConverter)
- 自定义转换器继承于转换器基类
- 添加转换器到默认的转换器字典中
- 使用自定义转换器实现自定义匹配规则
# 自定义转换器
# 1、导入转换器基类(BaseConverter)
from werkzeug.routing import BaseConverter # 2、自定义转换器继承于转换器基类
class MobileCheckConverter(BaseConverter): def __init__(self, url_map, mobile_regex):
"""
:param url_map:获取flask的路由映射列表
:param mobile_regex:获取第4步中的正则表达式
"""
# 调用父类的初始化方法
super().__init__(url_map) # 将第4步的正则规则保存到对象属性中,flask会使用这个属性进行路由匹配
self.regex = mobile_regex # self.regex 固定的属性,专门用来存放正则表达式 # 3、将自定义的转换器添加到默认的转换器字典中
app.url_map.converters["mobileCheck"] = MobileCheckConverter # 4、使用自定义转换器实现自定义匹配规则。
# 括号中的正则表达式会传入到第2步自定义的转换器中。本例中为mobile_regex接收正则表达式。
# 可以不使用括号传正则表达式,直接在第二步中的self.regex对象属性中直接定义正则表达式。
@app.route("/call/tel/2/<mobileCheck(r'1[35]\d{9}'):mobile>") # 匹配13|15开头的11位手机号
def call_tel_2(mobile):
return F"call {mobile}" if __name__ == '__main__':
# 通过url_map可以查看整个flask中的路由信息
print(app.url_map)
app.run()

转换器中的to_python和to_url
import time
from flask import Flask, redirect, url_for class MobileConverter(BaseConverter):
def __init__(self, url_map, regex):
super().__init__(url_map)
self.regex = regex def to_python(self, value):
"""
在路由的正则匹配成功后调用,并将匹配到的值赋值给value,再调用视图函数将value传回给视图函数,可以利用该特性对值进行处理。
:param value:
:return:
"""
print("to_python被调用", value)
return value def to_url(self, value):
"""
在to_python之后,调用视图函数之前调用。一般与url_for连用。
若执行了to_python,则value值为to_python的return值。
若使用了url_for,则value值为url_for传入的参数值,该值会传给重定向后的路由的to_python值
:param value:
:return:
"""
print("to_url被调用", value)
return value app.url_map.converters["getMobile"] = MobileConverter @app.route("/call/tel/3/<getMobile(r'\d{11}'):mobile>")
def call_tel_3(mobile):
return mobile @app.route("/call/tel/4/<getMobile(r'\d{3}'):mobile>")
def call_tel_4(mobile):
url = url_for("call_tel_3", mobile='15511112222')
time.sleep(1)
return redirect(url)


附码:
import time
from flask import Flask, redirect, url_for
from werkzeug.routing import BaseConverter app = Flask(__name__) @app.route("/")
def index():
return "hello flask url" @app.route("/")
def index2():
return "hello flask url 2" # 路径分隔符
@app.route("/hi1")
def hi_1():
return "hi1" @app.route("/hi2/")
def hi_2():
return "hi2" # 使用methods限定访问视图的方式。
@app.route("/post_only", methods=["POST"]) # 只允许post方式访问视图
def post_only():
return "post_only" # 当存在相同路径的路由时,根据请求方式区别视图
@app.route("/hello", methods=["POST"])
def hello1():
return "hello1" @app.route("/hello", methods=["GET"])
def hello2():
return "hello2" # 同一个视图可以配置多个路由
@app.route("/route1")
@app.route("/route2")
def double_route():
return "double_route" # 重定向
@app.route("/login")
def login():
# url = "/hello"
# 使用url_for函数可以通过视图函数名找到对应的url路径
# url = url_for("hello2", key1=value1, key2=value2) # 若视图函数需要传入参数,则直接以键值的方式传入即可。
url = url_for("hello2")
return redirect(url) # 转换器
# 系统自带的转换
#: the default converter mapping for the map.
# DEFAULT_CONVERTERS = {
# "default": UnicodeConverter,
# "string": UnicodeConverter, # 接受任何不包含斜杠的文本
# "any": AnyConverter, # 接受给定的枚举值,语法是<any(可选1,可选2...):参数名>,小括号列出匹配的枚举值,枚举值只能是字符串。
# "path": PathConverter, # 类似 string ,但可以包含斜杠
# "int": IntegerConverter, # 接受正整数
# "float": FloatConverter, # 接受正浮点数
# "uuid": UUIDConverter, # 接受 UUID 字符串
# }
@app.route("/call/tel/1/<int:mobile>")
def call_tel_1(mobile):
return F"call tel {mobile}" # 自定义转换器
# 1、导入转换器基类(BaseConverter)
from werkzeug.routing import BaseConverter # 2、自定义转换器继承于转换器基类
class MobileCheckConverter(BaseConverter): def __init__(self, url_map, mobile_regex):
"""
:param url_map:获取flask的路由映射列表
:param mobile_regex:获取第4步中的正则表达式
"""
# 调用父类的初始化方法
super().__init__(url_map) # 将第4步的正则规则保存到对象属性中,flask会使用这个属性进行路由匹配
self.regex = mobile_regex # self.regex 固定的属性,专门用来存放正则表达式 # 3、将自定义的转换器添加到默认的转换器字典中
app.url_map.converters["mobileCheck"] = MobileCheckConverter # 4、使用自定义转换器实现自定义匹配规则。
# 括号中的正则表达式会传入到第2步自定义的转换器中。本例中为mobile_regex接收正则表达式。
# 可以不使用括号传正则表达式,直接在第二步中的self.regex对象属性中直接定义正则表达式。
@app.route("/call/tel/2/<mobileCheck(r'1[35]\d{9}'):mobile>") # 匹配13|15开头的11位手机号
def call_tel_2(mobile):
return F"call {mobile}" class MobileConverter(BaseConverter):
def __init__(self, url_map, regex):
super().__init__(url_map)
self.regex = regex def to_python(self, value):
"""
在路由的正则匹配成功后调用,并将匹配到的值赋值给value,再调用视图函数将value传回给视图函数,可以利用该特性对值进行处理。
:param value:
:return:
"""
print("to_python被调用", value)
return value def to_url(self, value):
"""
在to_python之后,调用视图函数之前调用。一般与url_for连用。
若执行了to_python,则value值为to_python的return值。
若使用了url_for,则value值为url_for传入的参数值,该值会传给重定向后的路由的to_python值
:param value:
:return:
"""
print("to_url被调用", value)
return value app.url_map.converters["getMobile"] = MobileConverter @app.route("/call/tel/3/<getMobile(r'\d{11}'):mobile>")
def call_tel_3(mobile):
return mobile @app.route("/call/tel/4/<getMobile(r'\d{3}'):mobile>")
def call_tel_4(mobile):
url = url_for("call_tel_3", mobile='15511112222')
time.sleep(1)
return redirect(url) if __name__ == '__main__':
# 通过url_map可以查看整个flask中的路由信息
print(app.url_map)
app.run()
Flask_路由(二)的更多相关文章
- ASP.NET MVC 路由(二)
ASP.NET MVC路由(二) 前言 在上一篇中,提及了Route.RouteCollection对象的一些信息,以及它们的结构所对应的关系.按照处理流程走下来还有遗留的疑问没有解决这个篇幅就来讲 ...
- 基于gin的golang web开发:路由二
在基于gin的golang web开发:路由中我们介绍了Gin的路由和一些获取链接中参数的方法,本文继续介绍其他获取参数的方法. 文件上传 在web开发中文件上传是一个很常见的需求,下面我们来看一下基 ...
- Web API 路由 [二] Attribute Routing
1) 启用.在App_Start - WebApiConfig.cs下 //在Register函数添加如下代码: config.MapHttpAttributeRoutes(); 2) 使用.Cont ...
- Django框架的使用教程--视图和路由[二]
视图和路由 1.创建一个django_test应用 2.setting中设置django_test INSTALLED_APPS = [ 'django.contrib.admin', 'django ...
- (9)ASP.NET Core 中的MVC路由二
1.URL生成 MVC应用程序可以使用路由的URL生成功能,生成指向操作(Action)的URL链接. IUrlHelper 接口用于生成URL,是MVC与路由之间的基础部分.在控制器.视图和视图组件 ...
- MVC 源码系列之路由(二)
MVCParseData和Match方法的实现 ### ParseData 那么首先要了解一下ParseData. //namespace Route public string Url { get ...
- 路由(二) router-link的使用
main.js import Vue from 'vue'import App from './App'import VueRouter from 'vue-router'import footer ...
- C#进阶系列——WebApi 路由机制剖析:你准备好了吗?
前言:从MVC到WebApi,路由机制一直是伴随着这些技术的一个重要组成部分. 它可以很简单:如果你仅仅只需要会用一些简单的路由,如/Home/Index,那么你只需要配置一个默认路由就能简单搞定: ...
- AngularJS笔记---路由视图
最近有同事提到过关于ng-view的使用, 其实自己也不懂了,由于最近一直在做AngularJs的Rearch,所以就看了一些关于ng-view的国外博客. 做过ASP.NET MVC4的都知道, 我 ...
随机推荐
- 【Linux】【Services】【Web】Haproxy
1. 概念 1.1. 官方网站 http://www.haproxy.org/ 2. 安装 yum安装 yum -y install haproxy keepalived 配置haproxy日志,修改 ...
- 【.NET 与树莓派】控制彩色灯带(WS28XX)
彩色灯带,相信不用老周多说,大家都知道,没准你家里的灯墙里面就有.老周的茅屋是早期建造的,所以没有预留的灯槽,明灯的话是不好看的,因此老周家里没使用灯带.不过,像柜子后面,显示器后面,书桌边沿这些地方 ...
- Linux进程操作
查看进程启动时间 ps -eo pid,lstart | grep PID 查看进程的运行多久 ps -eo pid,etime |grep PID 查看进程中启动了哪些线程 top -H -p pi ...
- 主要视图展示(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 有同学拿Excel做甘特图的(咳咳,我也做过),这行为,其实目的就是为了--消食-- 好吧,也是为了学习Excel中图表或 ...
- MyBatis 3学习笔记
MyBatis 3 一.MyBatis简介 优秀的持久层框架,支持支持自定义 SQL.存储过程以及高级映射,专注于SQL的编写. 为什么不使用工具类进行数据库操作: 功能简单,sql语句编写在 ...
- .NET 云原生架构师训练营(系统架构)--学习笔记
目录 对外展现的功能 内部功能 功能交互与价值通路 系统架构 目标 认识系统的价值通路 认识功能架构,通过把功能结构与形式结构结合来描述系统架构 受益原则 好的架构必须使人受益,要想把架构做好,就要专 ...
- 获取登录验证码失败及前后端不同域导致session丢失问题分析记录
前言 前两周在把兄弟公司的几个服务部署到我们公司测试环境服务器的时候又遇到了不少问题,因为是前后端分离的项目,所以这次也同样遇到了跨域问题,解决方式也跟上一回的不一样,这里就再来分析记录一下. 登录验 ...
- linux 下查看文件修改时间
linux 下查看文件修改时间 等 http://blog.sina.com.cn/s/blog_6285b04e0100f4xr.html 查看文件时间戳命令:stat awk.txtFile: ` ...
- Spring实现自定义注解并且配置拦截器进行拦截
有时候我们会自定义注解,并且需要配置拦截器对请求方法含有该自定义注解的方法进行拦截操作 自定义注解类 NeedToken.java import java.lang.annotation.Docume ...
- 【LeetCode】456. 132 Pattern 解题报告(Python)
[LeetCode]456. 132 Pattern 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fu ...