【问题标题】:Ignore trailing slash in django url regex忽略 django url 正则表达式中的斜杠
【发布时间】:2016-01-21 16:07:44
【问题描述】:

我想从像

这样的所有 url 中捕获

example.com/<page_path>example.com/<page_path>/

<page_path> 部分。该变量可以是空的(重定向到example.com/start)或所需页面的路径(大多数时候是一个简单的字符串,但也可以包含斜杠)

这是我目前的urls.py,它似乎可以工作:

urlpatterns = [
    url(r'^/$', RedirectView.as_view(url="start"), name='index'),
    url(r'^$', RedirectView.as_view(url="start"), name='index'),
    url(r'^(?P<page>.+)/$', views.PageView.as_view(), name='page'),
    url(r'^(?P<page>.+)$', views.PageView.as_view(), name='page'),
]

但现在我试图简化表达式并想出了这个:

urlpatterns = [
    url(r'^/?$', RedirectView.as_view(url="start"), name='index'),
    url(r'^(?P<page>.+)/?$', views.PageView.as_view(), name='page'),
]

我想捕获所有内容,除非尾部有斜线。

奇怪的是,这适用于

  • example.com
  • example.com/
  • example.com/start

但不是为了

  • example.com/start/

有人能指出我的错误吗?

【问题讨论】:

  • 将您的网址更改为: url(r'^(?P[-\w]+)/?$', views.PageView.as_view(), name='page') ,
  • 我只更改了 regx。而不是 '.+' 使用 '[-\w]+',这应该可以工作。
  • @anush 所说的,您当前的正则表达式太贪婪,并且作为page 的一部分也在最后抓住斜线,所以/? 部分没有任何东西可以处理
  • 您不需要r'^/?$r'^$' 无论您输入example.com 还是example.com/ 都可以正常工作。
  • 如果您在日志中查看对http://example.comhttp://example.com/ 的请求,无论是否包含斜杠,您都会看到"GET / HTTP/1.1"。 Django 在解析 url 之前从请求中去除前导斜杠。所以如果你有r'^/$',它实际上会匹配//,这不是你想要的。在r'^$' 中不需要前导斜杠,就像在r'^(?P&lt;page&gt;.+)' 中不需要前导斜杠一样。 Django 1.9 将 check your url patterns 处理这个错误,以及其他几个错误。

标签: regex django


【解决方案1】:

有一个名为 APPEND_SLASH 的 Django 设置,默认值为 True

当设置为True 时,如果请求 URL 不匹配 URLconf 中的任何模式并且它没有以斜杠结尾,则会向附加斜杠的相同 URL 发出 HTTP 重定向。请注意,重定向可能会导致在 POST 请求中提交的任何数据丢失。

APPEND_SLASH 设置仅在安装了 CommonMiddleware 时使用。

来源:Django documentation: Settings

【讨论】:

  • 很有趣,但我的问题恰恰相反。我希望以斜杠结尾且不匹配任何模式的 URL 被重定向到没有斜杠的相同 URL。
【解决方案2】:

感谢您的 cmets,我可以用这个解决它:

urlpatterns = [
    url(r'^$', RedirectView.as_view(url="start"), name='index'),
    url(r'^(?P<page>.+?)/?$', views.PageView.as_view(), name='page'),
]

+ 量词太贪心,所以我用非贪心版本+? 替换它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-21
    • 2014-11-12
    • 2020-10-23
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 2021-06-13
    相关资源
    最近更新 更多