小白学Flask第三天| 今天把视图函数的路由给讲清楚!

简介: 小白学Flask第三天| 今天把视图函数的路由给讲清楚!

本文主要内容:


  1. 视图函数的路由规则设置说明
  2. 路由提取参数与自定义路由转换器
  3. 路由转换器的进阶使用



视图函数的路由规则设置说明


完整代码:


# -*- coding: utf-8 -*-
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
    return "hello flask"
if __name__ == '__main__':
    # 通过url_map可以查看整个flask中的路由信息
    print(app.url_map)
    # 启动flask程序
    app.run(debug=True)


首先我们来说说如何查看视图函数的路由:


# 通过url_map可以查看整个flask中的路由信息    print(app.url_map)


我们可以通过url_map来查看所有的路由信息,我们来看下输出结果:


image.png


大家可以看到输出了一个Map映射的对象,里面有一个列表,列表里就有着路由的详细信息。这里我给大家详细讲解一下里面的内容



Map([<Rule '/' (HEAD, OPTIONS, GET) -> index>, <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>])


这里面有两个规则,首先看第一个,'/' 是我们绑定的主路径,它所对应的视图函数是index,大家可以在上面的完整代码中查看。


那么中间那一部分到底是干啥的呢?中间括号中所代表的是当前视图函数所对应的路径的网络请求方法。HTTP里面的请求方式有很多,之前也跟大家谈到过。


在这个index视图函数中,我们看到默认有GET请求方式,那么如果我想要POST请求方式那该怎么做呢?    



@app.route("/post_only", methods=["POST"])def post_only():    return "post"


我们再次定义一个函数,大家可以看到装饰器里面多了一个参数,那里我们可以添加我们所想要的网络请求方式。


我们再看一下输出结果:


Map([<Rule '/post_only' (OPTIONS, POST) -> post_only>, <Rule '/' (GET, OPTIONS, HEAD) -> index>, <Rule '/static/<filename>' (GET, OPTIONS, HEAD) -> static>])


大家可能会对HEAD、OPTIONS有一点疑问,但是大家不用去管它们,它们都是flask自动帮我们补充的。


大家最好把一些常见的请求方式都添加到参数当中,这样可以防止一些错误的产生。



不同的视图函数但是有着相同的装饰器


说完了url_map,接下来给大家看一段代码:



# -*- coding: utf-8 -*-from flask import Flask
app = Flask(__name__)
@app.route("/hello")def hello1():    return "hello 1"
@app.route("/hello")def hello2():    return "hello 2"
if __name__ == '__main__':    # 通过url_map可以查看整个flask中的路由信息    print(app.url_map)    # 启动flask程序    app.run(debug=True)



大家可以看到我们两个不同的视图函数但是有着相同的装饰器,那这样还能正常打印出url_map吗?


image.png


可以看到这样是OK的,那么真正运行的时候到底运行哪个呢?


我们访问这个装饰器,可以看到真正运行的是第一个hello


image.png


那么当我们将两个视图函数的网络请求方式改成不一样的,还会出现这种情况吗?


# -*- coding: utf-8 -*-
from flask import Flask
app = Flask(__name__)
@app.route("/hello", methods=["POST"])
def hello1():
    return "hello 1"
@app.route("/hello", methods=["GET"])
def hello2():
    return "hello 2"
if __name__ == '__main__':
    # 通过url_map可以查看整个flask中的路由信息
    print(app.url_map)
    # 启动flask程序
    app.run(debug=True)


image.png


可以看到当我们把请求方式修改时,运行的是hello2。这里大家可能就会知道,当装饰器和请求方式完全相同时,那么执行的是第一个,如果装饰器相同但是请求方式不相同,那么它们将是独立的个体。


装饰器不同,但是视图函数相同


除了上面的情况之外,有没有装饰器不同,但是视图函数相同的情况呢?当然是有滴,看代码:


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


我们来执行一下:


image.png


可以看到无论是访问hi1还是hi2都是可以执行这个视图函数的



Flask中的重定向


# -*- coding: utf-8 -*-
from flask import Flask, redirect
app = Flask(__name__)
@app.route("/hello")
def hello1():
    return "hello 1"
@app.route("/login")
def login():
    url = '/hello'
    return redirect(url)
if __name__ == '__main__':
    # 启动flask程序
    app.run(debug=True)


上面代码意思就是通过访问login的视图函数跳转到/hello装饰器所对应的视图函数上。


我们可以发现上面的url是写死的,那如果某一天我把hello1视图函数的装饰器修改了,那我岂不是还要一个一个去修改?所以这里还有另外一种方法:


# -*- coding: utf-8 -*-
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route("/hello")
def hello1():
    return "hello 1"
@app.route("/login")
def login():
    url = url_for("hello1")
    return redirect(url)
if __name__ == '__main__':
    # 通过url_map可以查看整个flask中的路由信息
    print(app.url_map)
    # 启动flask程序
    app.run(debug=True)


可以看到我们又导入了一个叫url_for的方法,通过把视图函数的名称放进参数当中就可以找到视图函数所对应的url路径。



路由提取参数



image.png


有关于路由提取参数,转换器是不得不说的。那么转换器怎么去使用?


# -*- coding: utf-8 -*-
from flask import Flask
app = Flask(__name__)
@app.route("/goods/<int:goods_id>")
def goods(goods_id):
     return "goods_id: %s" % goods_id
if __name__ == '__main__':
    # 启动flask程序
    app.run(debug=True)


大家可以看到装饰器中所写的<int:goods_id>就是所谓的转换器,我们运行看一看:



image.png



成功的截取到了我们路由上的参数123


除了使用自带的转换器外,我们还可以不使用转换器


@app.route("/goods/<goods_id>")def goods(goods_id):
    return "goods_id: %s" % goods_id

此时抽取的类型是普通字符串类型(除了 / 字符)。



自定义转换器


虽然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)


上面代码是提取出路由中的电话号码。

相关文章
|
网络架构 Python
Flask的路由讲解
Flask的路由讲解
181 0
|
Python
Flask三种添加路由的方法
Flask 是一个流行的 Python Web 框架,它提供了多种方法来添加路由。路由是将 URL 映射到特定函数的过程,它是构建 Web 应用程序的基础。本文将介绍 Flask 中几种常用的路由添加方法,并附带代码示例。
359 3
|
API 网络架构 开发者
Flask Web开发基础【路由和Jinja2模板引擎】
# Flask Web开发基础 Flask是轻量级Web框架,专注于核心功能:请求响应、模板渲染和URL路由。本文档介绍了使用Flask的基础知识,包括命令行和Python两种运行模式,以及如何修改入口文件、端口和地址。此外,还讨论了URL路由的概念和其在Flask中的实现,展示了动态路由和多URL绑定的例子。最后,提到了Jinja2模板引擎,解释了其基本语法,并通过电影列表案例展示了如何结合Flask使用模板。
161 1
|
11月前
|
缓存 JSON 关系型数据库
四、Flask 视图使用方法详细概述
四、Flask 视图使用方法详细概述
116 0
|
11月前
|
中间件 网络架构 Python
三、Flask基本内容介绍之路由
三、Flask基本内容介绍之路由
165 0
|
Python
Flask路由
现代Web框架使用路由技术来帮助用户记住应用程序URL。 无需从主页导航即可直接访问所需页面。
210 0
|
开发框架 开发者 Python
使用 Flask 为 Web 应用添加路由
通过学习 Flask 中的视图函数和路由规则,你可以使用 Flask 构建强大的 Web 应用程序并为其添加功能。在 Flask 中,视图函数以 Python 函数的形式定义,每个视图函数都与一个 URL 相关联。在 Flask 中,URL 处理程序被称为视图函数,它们用于响应客户端请求并返回响应。在 Flask 应用程序中,这是可选的。在这里,我们将其命名为 'hello',并将其与 URL '/hello/<name>' 绑定在一起。在上面的示例中,我们使用了默认的视图函数名称 'hello'。
143 2
|
前端开发 文件存储 Python
【已解决】Flask当中render_template函数使用过程当中css文件无法正常渲染
【已解决】Flask当中render_template函数使用过程当中css文件无法正常渲染
|
网络架构 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应用。
339 1
|
JSON 数据格式 Python
如何在Flask框架中定义路由和处理请求?
【4月更文挑战第18天】在Flask框架中,创建应用实例、定义路由和处理请求涉及5个步骤:1) 导入Flask并实例化应用;2) 使用`app.route()`装饰器定义路由,指定URL和HTTP方法;3) 编写视图函数处理请求逻辑;4) 视图函数返回响应内容,Flask会自动转换格式;5) 用`app.run()`启动服务器。
249 3

热门文章

最新文章