Flask 路由处理 URL 路径末尾带斜线或不带斜线机制

简介: Flask 路由处理 URL 路径末尾带斜线或不带斜线机制

在浏览 Web 网站时,如果你细心观察会发现有些网站的 URL 网址末尾加不加斜线都能正常访问同一个页面。本篇文章就带大家来看看 Flask 中如何处理这种情况。

使用多个路由装饰器来绑定同一个视图函数

在 Flask 中通常来说每个请求由一个视图函数来处理,视图函数和请求 URL 的绑定是通过 @app.route() 装饰器实现的,使用 Flask 实现的一个最简单的 Hello World 程序如下:

from flask import Flask
app = Flask(__name__)
@app.route('/hello')
def hello():
    return 'Hello World!'
if __name__ == '__main__':
    app.run()

浏览器地址栏访问 http://127.0.0.1:5000/hello 即可得到 Hello World! 响应。

http://127.0.0.1:5000/hello

此时访问末尾带斜线的 URL 地址 http://127.0.0.1:5000/hello/ 则无法获得正确响应。

http://127.0.0.1:5000/hello/

要想使程序能够同时支持 URL 路径末尾带斜线或不带斜线,只需要在 hello 视图函数上再增加一个路由装饰器即可:

from flask import Flask
app = Flask(__name__)
@app.route('/hello/')
@app.route('/hello')
def hello():
    return 'Hello World!'
if __name__ == '__main__':
    app.run()

启动程序,再次访问 http://127.0.0.1:5000/hello/ 同样能得到 Hello World! 响应。

http://127.0.0.1:5000/hello/

使用 Flask 自带的机制来支持 URL 路径末尾带斜线或不带斜线

我们使用了两个路由装饰器解决了 URL 路径末尾带斜线或不带斜线都能正确得到响应的问题。但这样做对搜索引擎来说,同一个页面会被索引两次,对 SEO 是不利的。

实际上,Flask 本身是支持 URL 路径末尾带斜线或不带斜线都能访问同一个页面的。我们只需要使用 @app.route('/hello/') 一个路由装饰器即可:

from flask import Flask
app = Flask(__name__)
@app.route('/hello/')
def hello():
    return 'Hello World!'
if __name__ == '__main__':
    app.run()

启动程序,访问 http://127.0.0.1:5000/hello/ 可得到 Hello World! 响应。

hello_line1.png

http://127.0.0.1:5000/hello/

访问末尾不带斜线的 URL 路径 http://127.0.0.1:5000/hello 同样能得到 Hello World! 响应。

http://127.0.0.1:5000/hello

当我们去掉了 @app.route('/hello') 装饰器,只使用一个 @app.route('/hello/') 装饰器就能够同时支持 URL 路径末尾带斜线或不带斜线。

在 Chrome 开发者工具 Network 选项卡可以发现,实际上 Flask 实现这种机制的原理就是采用重定向。如果访问末尾不带斜线的 URL 路径 http://127.0.0.1:5000/hello,Flask 会自动返回 308 状态码,重定向到带斜线的 URL 路径 http://127.0.0.1:5000/hello/,以此来实现只需要绑定一个路由 @app.route('/hello/') 即可同时支持 URL 路径末尾带斜线或不带斜线。

Flask 以一种优雅的实现,即同时支持 URL 路径末尾带斜线或不带斜线两种路径,又不影响搜索引擎的 SEO,可谓一举两得,值得借鉴。

相关文章
|
29天前
|
Python
路由(URL routing)
【8月更文挑战第23天】
26 4
|
3月前
|
Python
Flask三种添加路由的方法
Flask 是一个流行的 Python Web 框架,它提供了多种方法来添加路由。路由是将 URL 映射到特定函数的过程,它是构建 Web 应用程序的基础。本文将介绍 Flask 中几种常用的路由添加方法,并附带代码示例。
37 3
|
3月前
|
API 网络架构 开发者
Flask Web开发基础【路由和Jinja2模板引擎】
# Flask Web开发基础 Flask是轻量级Web框架,专注于核心功能:请求响应、模板渲染和URL路由。本文档介绍了使用Flask的基础知识,包括命令行和Python两种运行模式,以及如何修改入口文件、端口和地址。此外,还讨论了URL路由的概念和其在Flask中的实现,展示了动态路由和多URL绑定的例子。最后,提到了Jinja2模板引擎,解释了其基本语法,并通过电影列表案例展示了如何结合Flask使用模板。
55 1
|
21天前
|
API 开发者 Python
"FastAPI路由大揭秘!轻松玩转URL映射,让你的Web应用路由设计既RESTful又灵活多变,秒杀传统框架的秘籍在这里!"
【8月更文挑战第31天】在Web开发中,路由是连接用户请求与后端逻辑的关键。FastAPI作为现代Python Web框架的佼佼者,以其简洁的API设计和高性能,提供了高度灵活的路由系统。本文通过开发一个博客系统的案例,详细介绍了FastAPI中路由的实现方法,包括基础路由定义、参数类型验证及路由分组与嵌套等,展示了如何轻松构建RESTful风格的URL映射,提升应用的可维护性和扩展性。
35 2
|
20天前
|
开发者 Java UED
大文件传输不再头疼:揭秘Struts 2如何轻松应对文件上传与下载难题!
【8月更文挑战第31天】在Web应用开发中,文件上传与下载至关重要。Struts 2作为主流Java EE框架,凭借Commons FileUpload及文件上传拦截器简化了相关操作。本文探讨Struts 2在文件传输上的优势,通过具体配置与代码示例,展示如何设置最大文件大小、使用`fileUpload`拦截器以及实现文件上传与下载功能。对于大文件传输,Struts 2不仅能够轻松应对,还支持上传进度显示,有效提升了用户体验。总体而言,Struts 2为文件传输提供了高效便捷的解决方案,助力开发者构建稳定可靠的Web应用。然而,在处理大文件时需兼顾网络带宽与服务器性能,确保传输顺畅。
39 0
|
20天前
|
API UED 开发者
Vaadin路由魔法:导航之舟,带你穿越页面迷宫!驾驭神奇URL,解锁无限可能!
【8月更文挑战第31天】Vaadin是一款现代Java Web开发框架,其路由机制结合前后端路由,确保流畅的用户体验和高效服务器资源利用。通过`@Route`注解和`Router`类,开发者可以轻松定义和管理页面路径。例如,`@Route("home")`可指定视图路径,而参数化路由如`@Route("user/:userId")`则允许URL传参。此外,Vaadin还提供了丰富的导航API和自定义路由事件监听器,助力开发者构建结构清晰且体验优秀的Web应用。
27 0
|
29天前
|
前端开发 API
【API管理 APIM】APIM中如何配置使用URL路径的方式传递参数(如由test.htm?name=xxx 变为test\xxx)
【API管理 APIM】APIM中如何配置使用URL路径的方式传递参数(如由test.htm?name=xxx 变为test\xxx)
|
3月前
|
前端开发 Java 开发者
在Spring框架中,`PathMatcher`是用于进行URL路径匹配的接口
在Spring框架中,`PathMatcher`是用于进行URL路径匹配的接口
85 6
|
3月前
|
开发框架 开发者 Python
使用 Flask 为 Web 应用添加路由
通过学习 Flask 中的视图函数和路由规则,你可以使用 Flask 构建强大的 Web 应用程序并为其添加功能。在 Flask 中,视图函数以 Python 函数的形式定义,每个视图函数都与一个 URL 相关联。在 Flask 中,URL 处理程序被称为视图函数,它们用于响应客户端请求并返回响应。在 Flask 应用程序中,这是可选的。在这里,我们将其命名为 'hello',并将其与 URL '/hello/<name>' 绑定在一起。在上面的示例中,我们使用了默认的视图函数名称 'hello'。
36 2
|
4月前
|
开发框架 搜索推荐 中间件
中间件应用路由和URL重写
【5月更文挑战第2天】中间件应用路由和URL重写
36 3
中间件应用路由和URL重写