Flask 路由分发及转换器

简介: Flask 路由分发及转换器

theme: smartblue

highlight: androidstudio

这是我参与更文挑战的第28天,活动详情查看: 更文挑战

<br/>

引言

本文重点介绍,Flask路由分发及访问静态资源。

<br/>

路由分发

app.route 装饰器的作用是将路由映射到视图函数,从浏览器输入对应的 url 地址,Flask程序,就会根据 url 找到对应的视图函数 (View Function) 进行处理。视图函数名字可以与 url 不同。 route 装饰器内部会调用 add_url_route() 方法实现路由注册。
"""
Author: hui
Desc: { Flask 路由分发 }
"""
from flask import Flask, url_for, redirect

"""
# 创建flask的应用对象
# __name__表示当前的模块名字
"""
app = Flask(__name__)


@app.route("/hello")
def welcome():
    return "hello flask"


@app.route("/index")
def index():
    return "index page"


if __name__ == "__main__":
    app.run()
    

<br/>

给路由指定访问方式

通过 methods 限定访问方式, 接受参数形式为列表
# post
@app.route("/post_only", methods=["POST"])
def post_only():
    return "post only page"


# get
@app.route("/get_only", methods=["GET"])
def get_only():
    return "get only page"

# post or get
@app.route("/test", methods=["GET", "POST"])
def test():
    return "post | get  page"

<br/>

多个路由绑定同一视图函数

@app.route("/hi1")
@app.route("/hi2")
def hi():
    return "hi page"

访问这两个/hi1/hi2路径显示的效果都是 hi page

多个路由绑定到同一视图函数

<br/>

url_for()和redirect()

使用 url_for() 的函数,可以通过 视图函数的名字 找到视图对应的 url 路径

redirect() 函数则是 url 重定向,会再次发送一个新的请求。

flask 库中导入这两个函数,一般这两个函数会一起使用。

<br/>

from flask import Flask, url_for, redirect


app = Flask(__name__)


# app.route装饰器的作用是将路由映射到视图函数
@app.route("/hello")
def welcome():
    return "hello flask"


@app.route("/")
def index():
    return "index page" 


@app.route("/login")
def login():
    # url = "/hello"
    # 使用url_for的函数,通过视图函数的名字找到视图对应的url路径
    url = url_for("welcome")
    print(url)
    return redirect(url)


@app.route("/register")
def register():
    url = "/"
    # url = url_for("index")
    return redirect(url)


if __name__ == "__main__":
    app.run()

<br/>

url_for('welcome') 等同于 /hello
url_for('index') 等同于 /

<br/>

在测试功能前,首先在浏览器中,右击鼠标选择检查或 F12 打开浏览器调试工具。进入 NetWork 选项。

浏览器调试工具

<br/>

然后在网址栏上分别输入 http://127.0.0.1:5000/loginhttp://127.0.0.1:5000/register

redirect请求重定向

这里就展示访问 /login 的效果,可以发现直接跳转到了 /hello 。这就是 重定向,发送了两次请求。

然后再看看 PyCharm 运行 Flask 程序的信息。

127.0.0.1 - - [25/Apr/2021 15:09:34] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [25/Apr/2021 15:18:25] "GET /login HTTP/1.1" 302 -
/hello
127.0.0.1 - - [25/Apr/2021 15:18:25] "GET /hello HTTP/1.1" 200 -
127.0.0.1 - - [25/Apr/2021 15:29:05] "GET /register HTTP/1.1" 302 -
127.0.0.1 - - [25/Apr/2021 15:29:05] "GET / HTTP/1.1" 200 -

切记url_for() 接收的是 视图函数的名称,返回的是对应的 url 路径,切勿把 url 路径传进去。

<br/>

查看全部路由信息

通过 app.url_map 可以查看所有路由信息
"""
Author: hui
Desc: { Flask 路由分发及静态资源访问 }
"""
from flask import Flask, url_for, redirect


app = Flask(__name__)


# app.route装饰器的作用是将路由映射到视图函数
@app.route("/hello")
def welcome():
    return "hello flask"


@app.route("/")
def index():
    # 通过url_map可以查看整个flask中的路由信息
    print(app.url_map)
    return "index page"


# 其他视图函数省略...


if __name__ == "__main__":
    app.run()

<br/>

访问首页打印如下结果

Map([<Rule '/post_only' (OPTIONS, POST) -> post_only>,
 <Rule '/get_only' (OPTIONS, HEAD, GET) -> get_only>,
 <Rule '/register' (OPTIONS, HEAD, GET) -> register>,
 <Rule '/hello' (OPTIONS, HEAD, GET) -> welcome>,
 <Rule '/login' (OPTIONS, HEAD, GET) -> login>,
 <Rule '/test' (OPTIONS, HEAD, POST, GET) -> test>,
 <Rule '/hi2' (OPTIONS, HEAD, GET) -> hi>,
 <Rule '/hi1' (OPTIONS, HEAD, GET) -> hi>,
 <Rule '/' (OPTIONS, HEAD, GET) -> index>])

<br/>

路由转换器

有时我们需要将同一类URL映射到同一个视图函数处理

比如:使用同一个视图函数 来显示不同用户的个人信息。

<br/>

Flask内置转换器

字符串转换器

"""
@Author: Hui
@Desc: { flask框架的转换器练习 }
"""
from flask import Flask

app = Flask(__name__)

# str转换器 不加转换器类型, 默认是普通字符串规则(除了/的字符)
@app.route('/user/<username>')
def user_str(username):
    response = 'hello {}'.format(username)
    return response


if __name__ == '__main__':
    app.run()
    

<br/>

注意:视图函数里接受的参数必须和 route 捕获尖括号 <> 里的参数一致。

字符串转换器

<br/>

整型转换器

# int转换器
@app.route('/user/<int:user_id>')
def user_int(user_id):
    response = 'hello {}'.format(user_id)
    return response

整型转换器

<br/>

路径转换器

# path转换器
@app.route('/user/<path:user>')
def user_path(user):
    response = 'hello {}'.format(user)
    return response

路径转换器

<br/>

自定义转换器

自定义一个匹配正则 url 的转换器

首先导入 werkzeug.routingBaseConverter

from werkzeug.routing import BaseConverter

然后自定义类继承 BaseConverter

from flask import Flask, url_for, redirect
from werkzeug.routing import BaseConverter

app = Flask(__name__)

# 自定义正则转换器
class RegexConverter(BaseConverter):
    """url正则匹配转换器"""

    def __init__(self, url_map, regex):
        super().__init__(url_map)
        self.regex = regex


app.url_map.converters['re'] = RegexConverter

# 匹配手机号码的正则
MobileRegex = "'0?(13|14|15|17|18)[0-9]{9}'"


# 使用自定义的转换器
@app.route(f"/call/<re({MobileRegex}):tel>")
def call_tel(tel):
    response = 'tel: {}'.format(tel)
    return response


if __name__ == "__main__":
    app.run()
    

<br/>

自定义正则转换器

<br/>

重写to_python()、to_url()方法

to_python() 用于处理转换器提取出来的参数,可以进行修改。

to_url() 使用 url_for() 时调用,其结果将作为 url_for的返回值。

# 自定义正则转换器
class RegexConverter(BaseConverter):
    """url正则匹配转换器"""

    def __init__(self, url_map, regex):
        super().__init__(url_map)
        self.regex = regex

    def to_python(self, value):
        print("to_python() called...")
        print(f"value, {value}")
        # value是在路径进行正则表达式匹配的时候提取的参数
        # 留了一步处理提取出来参数
        # 这里返回值是最终解析的结果
        return 'tel update 110'
        # return value

    def to_url(self, value):
        """使用 url_for() 时调用"""
        # 可以改变 url_for() 处理的结果
        print("to_url() called...")
        print(f"value, {value}")
        return "15811111111"
        # return value
        
                
app.url_map.converters['re'] = RegexConverter

# 匹配手机号码的正则
MobileRegex = "'0?(13|14|15|17|18)[0-9]{9}'"


# 使用自定义的转换器
@app.route(f"/call/<re({MobileRegex}):tel>")
def call_tel(tel):
    response = 'tel: {}'.format(tel)
    return response


@app.route("/call")
def call():
    url = url_for('call_tel', tel='13577881658')
    print(f'url -> {url}')
    return redirect(url)        

一般都无需重写,使用父类的就行。等有需求时在使用。

<br/>

重写to_python

<br/>

源代码

源代码已上传到 Gitee HuiDBK/FlaskBasic - 码云 - 开源中国 (gitee.com),欢迎大家来访。

✍ 码字不易,还望各位大侠多多支持:heart:。

<br/>

公众号

新建文件夹X

大自然用数百亿年创造出我们现实世界,而程序员用几百年创造出一个完全不同的虚拟世界。我们用键盘敲出一砖一瓦,用大脑构建一切。人们把1000视为权威,我们反其道行之,捍卫1024的地位。我们不是键盘侠,我们只是平凡世界中不凡的缔造者 。
相关文章
|
6月前
|
网络架构 Python
Flask的路由讲解
Flask的路由讲解
66 0
|
网络架构 Python
【flask入门系列】处理请求之url 路径参数的获取以及转换器的使用
这节我们写一下url路径参数的获取以及转换器的使用,学一下如何在我们的的url路径中加参数以及如何使用转换器,并且自定义转换器。
789 0
【flask入门系列】处理请求之url 路径参数的获取以及转换器的使用
|
5月前
|
Python
Flask三种添加路由的方法
Flask 是一个流行的 Python Web 框架,它提供了多种方法来添加路由。路由是将 URL 映射到特定函数的过程,它是构建 Web 应用程序的基础。本文将介绍 Flask 中几种常用的路由添加方法,并附带代码示例。
75 3
|
5月前
|
API 网络架构 开发者
Flask Web开发基础【路由和Jinja2模板引擎】
# Flask Web开发基础 Flask是轻量级Web框架,专注于核心功能:请求响应、模板渲染和URL路由。本文档介绍了使用Flask的基础知识,包括命令行和Python两种运行模式,以及如何修改入口文件、端口和地址。此外,还讨论了URL路由的概念和其在Flask中的实现,展示了动态路由和多URL绑定的例子。最后,提到了Jinja2模板引擎,解释了其基本语法,并通过电影列表案例展示了如何结合Flask使用模板。
70 1
|
1月前
|
中间件 网络架构 Python
三、Flask基本内容介绍之路由
三、Flask基本内容介绍之路由
25 0
|
2月前
|
Python
Flask路由
现代Web框架使用路由技术来帮助用户记住应用程序URL。 无需从主页导航即可直接访问所需页面。
35 0
|
5月前
|
开发框架 开发者 Python
使用 Flask 为 Web 应用添加路由
通过学习 Flask 中的视图函数和路由规则,你可以使用 Flask 构建强大的 Web 应用程序并为其添加功能。在 Flask 中,视图函数以 Python 函数的形式定义,每个视图函数都与一个 URL 相关联。在 Flask 中,URL 处理程序被称为视图函数,它们用于响应客户端请求并返回响应。在 Flask 应用程序中,这是可选的。在这里,我们将其命名为 'hello',并将其与 URL '/hello/<name>' 绑定在一起。在上面的示例中,我们使用了默认的视图函数名称 'hello'。
50 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应用。
101 1
|
6月前
|
JSON 数据格式 Python
如何在Flask框架中定义路由和处理请求?
【4月更文挑战第18天】在Flask框架中,创建应用实例、定义路由和处理请求涉及5个步骤:1) 导入Flask并实例化应用;2) 使用`app.route()`装饰器定义路由,指定URL和HTTP方法;3) 编写视图函数处理请求逻辑;4) 视图函数返回响应内容,Flask会自动转换格式;5) 用`app.run()`启动服务器。
93 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应用。