小白学Flask第四天| 把路由转换器玩的更牛逼

简介: 小白学Flask第四天| 把路由转换器玩的更牛逼

本文内容:


      路由转换器的进阶使用



自定义转换器


在上篇文章中我们也简单说了一下如何自定义转换器,我把代码重新弄过来:


# -*- coding: utf-8 -*-
from flask import Flask
from werkzeug.routing import BaseConverter
app = Flask(__name__)
# 1.定义自己的转换器
class RegexConverte(BaseConverter):
    def __init__(self, url_map, regex):
        # 调用父类的初始化方法
        super(RegexConverte, self).__init__(url_map)
        # 将正则表达式的参数保存在对象的属性中,flask会去使用这个属性来进行路由的正则匹配
        self.regex = regex
# 2. 将自定义的转换器添加到flask的应用中
app.url_map.converters["re"] = RegexConverte
@app.route("/send/<re(r'1[345678]\d{9}'):moblie>")
def send_sms(moblie):
    return "send_sms: %s" % moblie
if __name__ == '__main__':
    # 启动flask程序
    app.run(debug=True)


大家可能看着一个例子会有点懵,这里我再写一个比较具体的例子给大家,这次的例子还是提取电话号码 :



# -*- coding: utf-8 -*-
from flask import Flask
from werkzeug.routing import BaseConverter
app = Flask(__name__)
class MobileConverte(BaseConverter):
    def __init__(self,url_map):
        # 调用父类的初始化方法
        super(MobileConverte, self).__init__(url_map)
        self.regex = r'1[345678]\d{9}'
# 2. 将自定义的转换器添加到flask的应用中
app.url_map.converters["mobile"] = MobileConverte
@app.route("<mobile:moblie_num>")
def send_sms(moblie_num):
    return "send_sms: %s" % moblie_num
if __name__ == '__main__':
    # 启动flask程序
    app.run(debug=True)


大家会注意到在第10行,self.regex = r'1[345678]\d{9}' ,这句话其实就是我们整个功能的核心,在上一个例子中,我们是需要自己去定义正则表达式的,而这个例子只能实现提取电话号码这一个功能。



to_python方法


大家在自定义转换器时可能会发现我们需要创建一个类,然后我们初始化这个类。


按照这种写法一般不仅仅只是写了个__init__方法就可以实现转换器,而是这个类中还有其他的方法。


image.png


我们可以看到我们所继承的父类BaseConverter中,有to_python和to_url两个方法,我们首先来看看to_python方法。


其实to_python这个方法才是转换器的核心,当我们转换器提取到路径上面的参数后,不是直接返回给视图函数中的参数,而是要经过to_python方法才返回给视图函数,我给大家画了张图可能更容易理解:


image.png


怎么验证这个说法呢?我给大家举个例子:


image.png


大家可以看到我把to_python方法的返回值给改成了123456,我们运行一下看看它是返回“123456”还是返回路径中所提取的参数


image.png


可以看到无论我在地址栏上输入什么,返回都是123456


那么有人会问这个方法有些什么用呢?


当然是有很大用处的,就拿我们提取手机号码参数举例,如果我们只希望用户提交的是133开头的手机号,我们就可以在to_python这个方法里面去进行操作。



to_url方法


除了to_python方法,这个方法有什么用呢?其实to_url方法和我们之前讲的url_for方法有着很大的联系,我们可以看下下面的代码:


# -*- coding: utf-8 -*-
from flask import Flask,redirect,url_for
from werkzeug.routing import BaseConverter
app = Flask(__name__)
class MobileConverte(BaseConverter):
    def __init__(self,url_map):
        # 调用父类的初始化方法
        super(MobileConverte, self).__init__(url_map)
        self.regex = r'1[345678]\d{9}'
    def to_python(self, value):
        return "123456"
# 2. 将自定义的转换器添加到flask的应用中
# app.url_map.converters["re"] = RegexConverte
app.url_map.converters["mobile"] = MobileConverte
# http://127.0.0.1:5000/send/15123451234
@app.route("/send/<mobile:moblie_num>")
def send_sms(moblie_num):
    return "send_sms: %s" % moblie_num
@app.route("/index")
def index():
    url = url_for("send_sms", moblie_num="1892231312")
    return redirect(url)
if __name__ == '__main__':
    # 启动flask程序
    app.run(debug=True)


我们主要看:


@app.route("/index")def index():    url = url_for("send_sms", moblie_num="1892231312")    return redirect(url)


可以看到我们url_for里面有两个参数,第一则是指向我们send_sms视图函数的,后面那个则是send_sms函数中所提取电话号码的值。通过这样传值我们就可以通过url_for来调用一些有变化的参数的视图函数。


image.png


其实和to_python方法一样,每次进行url_for提交的参数都会先经过to_url,经过处理后才会返回回去。这里我就不过多演示。

相关文章
|
6月前
|
网络架构 Python
Flask的路由讲解
Flask的路由讲解
60 0
|
网络架构 Python
【flask入门系列】处理请求之url 路径参数的获取以及转换器的使用
这节我们写一下url路径参数的获取以及转换器的使用,学一下如何在我们的的url路径中加参数以及如何使用转换器,并且自定义转换器。
784 0
【flask入门系列】处理请求之url 路径参数的获取以及转换器的使用
|
5月前
|
Python
Flask三种添加路由的方法
Flask 是一个流行的 Python Web 框架,它提供了多种方法来添加路由。路由是将 URL 映射到特定函数的过程,它是构建 Web 应用程序的基础。本文将介绍 Flask 中几种常用的路由添加方法,并附带代码示例。
64 3
|
5月前
|
API 网络架构 开发者
Flask Web开发基础【路由和Jinja2模板引擎】
# Flask Web开发基础 Flask是轻量级Web框架,专注于核心功能:请求响应、模板渲染和URL路由。本文档介绍了使用Flask的基础知识,包括命令行和Python两种运行模式,以及如何修改入口文件、端口和地址。此外,还讨论了URL路由的概念和其在Flask中的实现,展示了动态路由和多URL绑定的例子。最后,提到了Jinja2模板引擎,解释了其基本语法,并通过电影列表案例展示了如何结合Flask使用模板。
64 1
|
15天前
|
中间件 网络架构 Python
三、Flask基本内容介绍之路由
三、Flask基本内容介绍之路由
20 0
|
2月前
|
Python
Flask路由
现代Web框架使用路由技术来帮助用户记住应用程序URL。 无需从主页导航即可直接访问所需页面。
33 0
|
5月前
|
开发框架 开发者 Python
使用 Flask 为 Web 应用添加路由
通过学习 Flask 中的视图函数和路由规则,你可以使用 Flask 构建强大的 Web 应用程序并为其添加功能。在 Flask 中,视图函数以 Python 函数的形式定义,每个视图函数都与一个 URL 相关联。在 Flask 中,URL 处理程序被称为视图函数,它们用于响应客户端请求并返回响应。在 Flask 应用程序中,这是可选的。在这里,我们将其命名为 'hello',并将其与 URL '/hello/<name>' 绑定在一起。在上面的示例中,我们使用了默认的视图函数名称 'hello'。
48 2
|
6月前
|
网络架构 Python
在Flask中,如何定义路由并处理HTTP请求的不同方法(GET、POST等)?
【4月更文挑战第25天】在Flask中,使用`@app.route()`装饰器定义路由,如`/hello`,处理GET请求返回&#39;Hello, World!&#39;。通过添加`methods`参数,可处理不同HTTP方法,如POST请求。单一函数可处理多种方法,通过检查`request.method`区分。动态路由使用 `&lt;variable_name&gt;` 传递URL变量到视图函数。这些基础构成处理HTTP请求的Flask应用。
94 1
|
6月前
|
JSON 数据格式 Python
如何在Flask框架中定义路由和处理请求?
【4月更文挑战第18天】在Flask框架中,创建应用实例、定义路由和处理请求涉及5个步骤:1) 导入Flask并实例化应用;2) 使用`app.route()`装饰器定义路由,指定URL和HTTP方法;3) 编写视图函数处理请求逻辑;4) 视图函数返回响应内容,Flask会自动转换格式;5) 用`app.run()`启动服务器。
91 3
|
6月前
|
开发框架 中间件 网络架构
Flask路由机制深度剖析
【4月更文挑战第15天】Flask是一款轻量级Web框架,其路由机制是核心功能之一,负责将URL映射到处理函数。路由通过`@app.route()`装饰器定义,如`@app.route(&#39;/&#39;)`将根URL映射到`index`函数。动态路由如`/user/&lt;username&gt;`允许传入变量,支持`methods`、`defaults`和`strict_slashes`等参数定制行为。Flask还提供多种路由转换器(如`int`、`float`)确保URL参数类型。`url_for()`函数用于动态构建URL。理解这些机制有助于高效构建和扩展Flask Web应用。