【问题标题】:How to design Flask URL path with '/'如何使用“/”设计 Flask URL 路径
【发布时间】:2016-05-04 02:02:45
【问题描述】:

在我的第一个 Flask 应用程序中,我正在试验以斜杠结尾的 URL 与不以斜杠结尾的 URL,并且看到一些意外的浏览器行为。

  1. 我的视图函数是这样的:

    @app.route('/hello')
    def hello_world():
        return 'Hello World!'
    

    那我可以去127.0.0.1:5000/hello看“Hello World”。

  2. 我把网址改成:

    @app.route('/hello/')
    def hello_world():
        return 'Hello World!'
    

    然后我可以转到127.0.0.1:5000/hello,但浏览器会重定向到127.0.0.1:5000/hello/

  3. 我把网址back改成/hello:

    @app.route('/hello')
    def hello_world():
        return 'Hello World!'
    

那么我无法访问/hello /hello/。当我访问127.0.0.1:5000/hello 时,浏览器仍然会重定向127.0.0.1:5000/hello/ 并且响应是 404。除非我回滚到第 2 步,否则我什么都看不到。

发生了什么事?

【问题讨论】:

  • flask 输出到底是什么错误?
  • Flask 可能做了 301(永久重定向),被浏览器缓存。你能追踪到 127.0.0.1:5000/hello 响应的状态码吗?
  • 没有错误,浏览器只查看404页面。

标签: python url flask


【解决方案1】:

引用自(稍作修改的)section of the docs

唯一网址/重定向行为

虽然 [您的规则] 看起来很相似,但它们在 URL 定义中使用的尾部斜杠不同。在 [您的步骤 #2] 中,[hello_world] 端点的规范 URL 有一个尾部斜杠。从这个意义上说,它类似于文件系统上的文件夹。不带斜杠访问它会导致 Flask 重定向到带有斜杠的规范 URL。

这意味着第 2 步中的 Flask 将使用 301 Moved redirect 重定向 /hello URL。这是一个永久重定向,大多数浏览器都会缓存它。这就是为什么,即使您更改了 代码(在第 3 步中),即使您请求了 /hello,浏览器仍会请求 /hello/(因为它在第 2 步 Flask 中这样做了)告诉它/hello移动/hello/。)

在这种情况下,最简单的解决方案是清除浏览器的缓存 - 这会删除重定向的“内存”,然后一切都会恢复正常。

就我个人而言,我使用 /directory/ 样式的 URL 来表示应该包含其他资源的资源,/leaf 表示没有进一步子资源的资源。

【讨论】:

  • 可以申请django吗?likeurl(r'^grid/$', ...), url(r'^grid/leaf/', ...),推荐改成url(r'^grid/$', ...), url(r'^grid/leaf', ...),
  • 是的,Django 有一个APPEND_SLASH settingCommonMiddleware 使用它来执行类似的行为。
猜你喜欢
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多