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,可谓一举两得,值得借鉴。

相关文章
|
2月前
|
JavaScript 前端开发 小程序
JavaScript获取当前url路径
JavaScript获取当前url路径
|
5月前
|
安全 测试技术 网络安全
软件测试|测试平台开发-Flask 入门:URL组成部分详解
软件测试|测试平台开发-Flask 入门:URL组成部分详解
30 0
|
3月前
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
|
2月前
|
前端开发
vue-element-admin最新版4.4实现多个url路由匹配到一个路径时,左侧菜单保持高亮状态
vue-element-admin最新版4.4实现多个url路由匹配到一个路径时,左侧菜单保持高亮状态
18 0
|
2月前
|
前端开发
如何让url在新页面打开路由页面,并脱离vue-admin-template的壳,即不包裹在侧边栏和顶栏中
如何让url在新页面打开路由页面,并脱离vue-admin-template的壳,即不包裹在侧边栏和顶栏中
10 0
|
2月前
|
测试技术 Apache 项目管理
软件测试|探索Flask接口路由技术:构建灵活可拓展的Python应用
软件测试|探索Flask接口路由技术:构建灵活可拓展的Python应用
19 1
|
3月前
用Angular获取当前地址的路径path(也就是网址/#后面那坨url)
用Angular获取当前地址的路径path(也就是网址/#后面那坨url)
|
5月前
|
存储 测试技术 网络架构
软件测试|测试平台开发-Flask入门:Flask动态路由
软件测试|测试平台开发-Flask入门:Flask动态路由
31 0
|
6月前
|
Web App开发 前端开发 JavaScript
SAP UI5 应用开发教程之一百零六 - 如何提高 SAP UI5 应用路由 url 的可读性试读版
SAP UI5 应用开发教程之一百零六 - 如何提高 SAP UI5 应用路由 url 的可读性试读版
32 0
|
6月前
|
数据采集 搜索推荐 Java
Java_URL类这是你通往其他网站的唯一路径
Java_URL类这是你通往其他网站的唯一路径
60 0

相关产品

  • 云迁移中心