关于flask路由app.route及路由参数的各种用法解析

 更新时间:2024年03月22日 09:42:48   作者:景天科技苑  
我们在开发过程中,编写项目时所使用的路由往往是指代了框架/项目中用于完成路由功能的类,这个类一般就是路由类,简称路由,这篇文章主要介绍了有关flask路由app.route及路由参数的各种用法解析,需要的朋友可以参考下

flask路由

1.路由的基本定义

什么是路由?

路由就是一种映射关系。是绑定应用程序(视图)和url地址的一种一对一的映射关系!
我们在开发过程中,编写项目时所使用的路由往往是指代了框架/项目中用于完成路由功能的类,这个类一般就是路由类,简称路由。

路由和视图的名称必须全局唯一,不能出现重复,否则报错。
路由重复,走先声明的,视图函数重复直接报错。

代码示例:

# 1. 导入flask核心类
from flask import Flask
# 2. 初始化web应用程序的实例对象
app = Flask(__name__)
# 开启debug模式
app.config["DEBUG"] = True
# 参数1:rule设置当前视图的路由地址
# 参数2:methods,设置当前视图的HTTP请求方法,允许一个或多个方法,不区分大小写,如果使用非设置的请求方法来访问,会报405错误
@app.route(rule="/", methods=["get", "post"])
def index():
    return "<h1>hello flask1</h1>"
if __name__ == '__main__':
    # 3. 运行flask提供的测试web服务器程序
    app.run(host="0.0.0.0", port=5000)

如下,使用非指定请求方法来访问,会报错

使用postman来使用post请求

使用get请求测试,可以正常拿到响应数据

2.路由参数接收方式

flask中,url可以传递路由参数,有2种方式:

路由参数就是url路径的一部分。

1.接收任意路由参数

# 1. 导入flask核心类
from flask import Flask
# 2. 初始化web应用程序的实例对象
app = Flask(__name__)
# 开启debug模式
app.config["DEBUG"] = True
@app.route(rule="/", methods=["get", "post"])
def index():
    return "<h1>hello flask1</h1>"
"""
路由参数的传递
尖括号圈住,里面写上参数变量名
在视图中即可通过参数列表按命名来接收
接收参数时,如果没有在设置路由中设置参数的类型,则默认参数类型为字符串类型
"""
@app.route("/goods/<cid>/<gid>")
def goods(gid, cid):
    print(gid, type(gid))
    print(cid, type(cid))
    return f"显示cid={cid},gid={gid}的商品信息"
if __name__ == '__main__':
    # 3. 运行flask提供的测试web服务器程序
    app.run(host="0.0.0.0", port=5000)

浏览器访问,拿到url输入的数据

2.接收限定类型参数

限定路由参数的类型,flask系统自带转换器编写在werkzeug/routing/converters.py文件中。底部可以看到以下字典:

在这个文件的最后配置

# converters用于对路由中的参数进行格式转换与类型限定的
 t.Mapping[str, t.Type[BaseConverter]是为了告诉读者,里面数据左边是个字符串,右边是数据类型
python3.6新增了一个typing模块,让我们在编写python代码的变量时,可以同时设置变量的数据类型
DEFAULT_CONVERTERS: t.Mapping[str, t.Type[BaseConverter]] = {
    "default": UnicodeConverter, # 默认类型,也就是string
    "string": UnicodeConverter, # 字符串,不包含 /
    "any": AnyConverter,    # 任意类型
    "path": PathConverter,  # 也是字符串,但是包含了 /
    "int": IntegerConverter,
    "float": FloatConverter,
    "uuid": UUIDConverter,
}

系统自带的转换器具体使用方式在每种转换器的注释代码中有写,请留意每种转换器初始化的参数。

代码:

# 1. 导入flask核心类
from flask import Flask
# 2. 初始化web应用程序的实例对象
app = Flask(__name__)
# 开启debug模式
app.config["DEBUG"] = True
@app.route(rule="/", methods=["get", "post"])
def index():
    return "<h1>hello flask1</h1>"
"""
通过路由转换器来对路由参数显示格式转换和限制类型
"""
@app.route("/goods/<float:cid>/<uuid:gid>")
def goods(gid, cid):
    print(gid, type(gid))
    print(cid, type(cid))
    return f"显示cid={cid},gid={gid}的商品信息"
if __name__ == '__main__':
    # 3. 运行flask提供的测试web服务器程序
    app.run(host="0.0.0.0", port=5000)

此时对于传入非指定类型的参数,则会报404错误

传指定类型参数,才能正常访问

3.自定义路由参数转换器

也叫正则匹配路由参数.

在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,根据自己的规则去限定请求参数再进行访问

具体实现步骤为:

  • 导入转换器基类BaseConverter:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录
  • 自定义转换器:自定义类继承于转换器基类BaseConverter
  • 添加转换器到默认的转换器字典DEFAULT_CONVERTERS中
  • 使用自定义转换器实现自定义匹配规则

代码实现

# 1. 导入flask核心类
from flask import Flask
# 2. 初始化web应用程序的实例对象
app = Flask(__name__)
# 开启debug模式
app.config["DEBUG"] = True
"""
自定义路由转换[在实际项目开发中,我们会单独准备一个python文件来保存转换器的定义代码]
"""
from werkzeug.routing.converters import BaseConverter
#在我们自定义的类里面写正则规则,并要继承BaseConverter
class MobileConverter(BaseConverter):
    """手机号参数类型的转换器"""
    regex = r"1[3-9]\d{9}"
# 把自定义路由转换器类注册到flask项目中,中括号里面的参数我们下面路由转换器类要用到
app.url_map.converters["mob"] = MobileConverter
@app.route("/sms/<mob:mobile>")
def sms(mobile):
    return f"发送短信给手机号:{mobile}的用户"
if __name__ == '__main__':
    # 3. 运行flask提供的测试web服务器程序
    app.run(host="0.0.0.0", port=5000)

运行程序访问,但凡不满足正则规则的请求,都无法正常访问
手机号太短

包含非数字

满足正则要求的手机号,可以正常访问

但是这样,我们写个类就把正则规则定死了,不方便其他路由调用
因此,我们需要优化,我们需要根据实际需要的正则来分别自定义
此时,我们需要将正则作为参数传进去

导入转换器基类
from werkzeug.routing.converters import BaseConverter

自定义转换器
先看下父类

class RegexConverter(BaseConverter):
    def __init__(self, map, *args, **kwargs):
        super().__init__(map, *args, **kwargs)  #我们不用进行类型限定
        self.regex = args[0]
- 添加转换器到默认的转换器字典中,并指定转换器使用时名字为: re
app.url_map.converters["re"] = RegexConverter
- 使用转换器去实现自定义匹配规则,当前此处定义的规则是:手机号码 
"""
自定义路由转换[在实际项目开发中,我们会单独准备一个python文件来保存转换器的定义代码]
"""
from werkzeug.routing.converters import BaseConverter
class RegexConverter(BaseConverter):
    def __init__(self, map, *args, **kwargs):
        super().__init__(map, *args, **kwargs)
        self.regex = args[0]
app.url_map.converters["re"] = RegexConverter
@app.route("/sms/<re('1[3-9]\d{9}'):mobile>")
def sms(mobile):
    return f"发送短信给手机号:{mobile}的用户"
@app.route("/goods/<re('\d+'):id>")
def goods(id):
    return f"显示商品id={id}的信息"

完整代码,包含各种注释解释:

# 1. 导入flask核心类
from flask import Flask
# 2. 初始化web应用程序的实例对象
app = Flask(__name__)
# 开启debug模式
app.config["DEBUG"] = True
"""
自定义路由转换[在实际项目开发中,我们会单独准备一个python文件来保存转换器的定义代码]
"""
from werkzeug.routing.converters import BaseConverter
#注意,自定义的类需要继承BaseConverter,并且要重载父类初始化方法,初始化父类,接收re的参数
class RegexConverter(BaseConverter):
    def __init__(self, map, *args, **kwargs):
        super().__init__(map, *args, **kwargs)
        self.regex = args[0]
#中括号里面的值 re,就是我们在路由定义转换器类时需要调用的
app.url_map.converters["re"] = RegexConverter   #这个就是我们自定义的类
@app.route("/sms/<re('1[3-9]\d{9}'):mobile>")  #这样,每次路由在参数正则定义式,就作为参数传给我们定义的类
def sms(mobile):
    return f"发送短信给手机号:{mobile}的用户"
@app.route("/goods/<re('\d+'):id>")  #此时传的是id的正则,只限制数字
def goods(id):
    return f"显示商品id={id}的信息"
if __name__ == '__main__':
    # 3. 运行flask提供的测试web服务器程序
    app.run(host="0.0.0.0", port=5000)

如果我们随便输入参数,则访问不到

输入正确的手机号可以访问到

发送正确的商品id,也可以访问到

到此这篇关于有关flask路由app.route及路由参数的各种用法解析的文章就介绍到这了,更多相关flask路由app.route内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Django项目单字段区间查询的实现

    Django项目单字段区间查询的实现

    在Django项目中会碰到一些需求就是查询某个表中的一些字段从某日到某日的数据,你可以像在SQL中那样使用SELECT语句来查找指定字段,本文就来介绍两种方法,感兴趣的可以了解一下
    2023-10-10
  • python类和函数中使用静态变量的方法

    python类和函数中使用静态变量的方法

    这篇文章主要介绍了python类和函数中使用静态变量的方法,实例分析了三种常用的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-05-05
  • Python3爬虫带上cookie的实例代码

    Python3爬虫带上cookie的实例代码

    在本篇文章里小编给各位分享的是一篇关于Python3爬虫带上cookie的实例代码内容,需要的朋友们可以学习下。
    2020-07-07
  • 解决python虚拟环境切换无效的问题

    解决python虚拟环境切换无效的问题

    这篇文章主要介绍了解决python虚拟环境切换无效的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • python使用python-pptx删除ppt某页实例

    python使用python-pptx删除ppt某页实例

    今天小编就为大家分享一篇python使用python-pptx删除ppt某页实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Python字符串与正则表达式详细介绍

    Python字符串与正则表达式详细介绍

    这篇文章主要介绍了Python字符串与正则表达式,Python字符串与正则表达式在Python中具有非常重要的地位,熟练的使用字符串与正则表达式能够为我们的Python编程提供很多的便利之处,希望您阅读完本文后能够有所收获
    2022-01-01
  • python的re模块应用实例

    python的re模块应用实例

    这篇文章主要介绍了python的re模块应用实例,包括了常见的正则匹配技巧,需要的朋友可以参考下
    2014-09-09
  • python爬虫判断招聘信息是否存在的实例代码

    python爬虫判断招聘信息是否存在的实例代码

    在本篇文章里小编给大家整理的是一篇关于python爬虫判断招聘信息是否存在的实例代码,有兴趣的朋友们可以学习下。
    2020-11-11
  • Python多进程原理与用法分析

    Python多进程原理与用法分析

    这篇文章主要介绍了Python多进程原理与用法,结合实例形式分析了Python多进程原理、开启使用进程、进程队列、进程池等相关概念与使用方法,需要的朋友可以参考下
    2018-08-08
  • python pow函数的底层实现原理介绍

    python pow函数的底层实现原理介绍

    这篇文章主要介绍了python pow函数的底层实现原理介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03

最新评论