FLASK博客系列4——再谈路由

最近好像拖更有点久了。抱歉抱歉~

今天我们继续来聊聊路由(其实就是我上次偷懒剩下一点没讲完)。

通过上次的文章,我们基本了解了Flask中的路由,是不是比较简单呢?别急,今天来点猛料。

一、路由之HTTP方法绑定。

我们都知道网站通过HTTP与浏览器或其他客户端进行交互,而访问一个URL时通常有好几种访问方式。像我们用浏览器平时访问百度啊,用的其实是Get。像其他的方法还有POST、HEAD、PUT、DELETE等,详细的大家可以自行百度。

在Flask中,路由默认设置使用GET方式进行路径访问。

1、指定HTTP访问方式的方法。

有小伙伴就说了,那我想改变访问的方式怎么办?

其实很简单,我们只需要修改**route()**中的参数,就可以配置其他访问方式。举个栗子:

python 复制代码
@app.route('/', methods=['GET', 'POST'])
def hello_world():
    return 'Hello World!'

然后我们这次用大家都比较熟悉的神器postman 来调用一下我们的接口。我们选择POST方法访问,可以看到我们成功访问了。如下图:

如果不设置允许POST方法,那么flask 就会返回405,如下图:

那就算客户端用了不同的方式访问,我们怎么知道是哪一种呢?诶,调皮,Flask 早就为我们考虑到了。我们可以通过request.method 来获取客户端的请求方式。request是Flask框架的一个全局对象,可以获得很多和HTTP请求的客户端相关的信息,比如cookies、headers、data、file等等。示例代码如下:

python 复制代码
@app.route('/', methods=['GET', 'POST'])
def hello_world():
    if request.method == "GET":
        return "GET方法"
    else:
        return 'Hello World!'

当使用GET 方法访问的时候,就会返回"GET方法 ",而用POST 就会返回"Hello World!"

对了,顺带说一句,设置允许请求方法的时候,名字是可以大小写混用的,你可以写成"get"或者"Get",当然一般还是统一一下比较好。悄悄告诉你,这是因为Flask最终都会将你写的转为大写,所以不影响。可见人家早就预料到你们会搞这些花里胡哨的东西了。源码如下:

python 复制代码
methods = set(item.upper() for item in methods)

2、同一个URL映射到不同的函数

有些小伙伴说我不想用request.method去判断,我想要花里胡哨。好,行行行,依你依你~

我们来看一段代码:

python 复制代码
@app.route('/hello', methods=['GET'])
def hello():
    return '花里胡哨的GET'

@app.route('/hello', methods=['POST'])
def hi():
    return '花里胡哨的POST'

再看看访问的结果:

好啦。这就是你们要的花里胡哨的效果。之所以可以这样做(还不是人家早知道你们整天就喜欢搞这些花里胡哨的东西),实际上是Flask定义了2组隐式的访问方式的规则。

二、路由地址反向生成

通过签名花里胡哨的操作,不不不,是学习,相信你已经掌握了更多关于路由的功能。到这里,有些同学又要来搞一波操作了。既然能通过路由去访问到函数,那可不可以通过函数来知道路由地址呢?这个问题就很有水平了。答案当然是可以啦,我们一起来看看。

这次不卖关子了,我们先从Flask 包中引入url_for函数。

python 复制代码
from flask import url_for

接着看一则完整的例子:

python 复制代码
from flask import Flask
from flask import url_for

app = Flask(__name__)


@app.route('/')
def hello_world():
    # 返回hello函数所对应的URL
    return url_for("hello")


@app.route('/hello')
def hello():
    return 'hello world!'


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

接着我们去访问http://127.0.0.1:5000 。可以看到,hello函数对应的URL就显示出来了。

url_for函数的第1个参数是需要获取URL的函数名,如果URL有变量,只需要在函数中添加参数然后对其赋值即可。我们再看一个例子:

python 复制代码
from flask import Flask
from flask import url_for

app = Flask(__name__)


@app.route('/')
def hello_world():
    print(url_for('hello'))  # /hello
    print(url_for('hello', name="clannadhh"))  # /hello?name=clannadhh
    print(url_for('hi', name="clannadhh"))  # /hi/clannadhh
    return "http://www.clannadhh.club"


@app.route('/hello')
def hello():
    return 'hello world!'


@app.route('/hi/<string:name>')
def hi(name):
    return 'hello %s' % name


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

使用url_for函数有什么好处呢?

  • 反向解析比硬编码有更好的可读性和可维护性。比如,当需要更换路由函数中的URL的地址时,你的代码改动就会非常小。
  • url_for函数还会自动处理特殊字符,同时也会做Unicode编码转换。像空格就会转换成"%20",而中文同样的也会转换,因为flask是不知道中文的。

最后教大家个花里胡哨的东西,至于效果怎样,那就等待大家试了之后留言吧。记得打赏,疯狂暗示~

python 复制代码
@app.route('/rmb')
@app.route('/nb')
@app.route('/')
def hello_world():
    return "hello world!"

现在再去访问以下3个地址,看会发生什么?

markup 复制代码
http://127.0.0.1:5000/
http://127.0.0.1:5000/nb
http://127.0.0.1:5000/rmb

好啦,今天内容还是蛮多的。好看记得推荐给身边的朋友吧,打个赏再走呗~

相关推荐
鹏码纵横3 小时前
已解决:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 异常的正确解决方法,亲测有效!!!
java·python·mysql
仙人掌_lz3 小时前
Qwen-3 微调实战:用 Python 和 Unsloth 打造专属 AI 模型
人工智能·python·ai·lora·llm·微调·qwen3
weixin_985432113 小时前
Spring Boot 中的 @ConditionalOnBean 注解详解
java·spring boot·后端
猎人everest4 小时前
快速搭建运行Django第一个应用—投票
后端·python·django
猎人everest4 小时前
Django的HelloWorld程序
开发语言·python·django
chusheng18405 小时前
2025最新版!Windows Python3 超详细安装图文教程(支持 Python3 全版本)
windows·python·python3下载·python 安装教程·python3 安装教程
别勉.5 小时前
Python Day50
开发语言·python
xiaohanbao095 小时前
day54 python对抗生成网络
网络·python·深度学习·学习
爬虫程序猿6 小时前
利用 Python 爬虫按关键字搜索 1688 商品
开发语言·爬虫·python
英杰.王6 小时前
深入 Java 泛型:基础应用与实战技巧
java·windows·python