Regex 忽略django url正则表达式中的尾部斜杠

Regex 忽略django url正则表达式中的尾部斜杠,regex,django,Regex,Django,我想从所有的URL抓取像 example.com/或example.com/ 部分。变量可以是空的(重定向到example.com/start)或所需页面的路径(大多数情况下是一个简单的字符串,但也可以有斜杠) 这是我当前的url.py,它似乎可以工作: urlpatterns = [ url(r'^/$', RedirectView.as_view(url="start"), name='index'), url(r'^$', RedirectView.as_view(url=

我想从所有的URL抓取像

example.com/
example.com/

部分。变量可以是空的(重定向到
example.com/start
)或所需页面的路径(大多数情况下是一个简单的字符串,但也可以有斜杠)

这是我当前的
url.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'^/$',重定向视图.as_view(url=“start”),name='index'),
url(r'^$',重定向视图。作为_视图(url=“start”),name='index'),
url(r'^(?P.+)/$',views.PageView.as_view(),name='page'),
url(r'^(?P.+)$',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'),
]
urlpatterns = [
    url(r'^$', RedirectView.as_view(url="start"), name='index'),
    url(r'^(?P<page>.+?)/?$', views.PageView.as_view(), name='page'),
]
urlpatterns=[
url(r'^/?$',重定向视图。作为_视图(url=“开始”),name='index'),
url(r'^(?P.+)/?$',views.PageView.as_view(),name='page'),
]
我想捕捉所有的东西,除非有一个尾随斜杠

奇怪的是,这对你有用

  • example.com
  • example.com/
  • example.com/start
但不是为了

  • example.com/start/

有人能指出我的错误吗?

有一个名为
APPEND\u SLASH
的Django设置,默认值为
True

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

只有在安装了CommonMiddleware的情况下才使用
APPEND\u SLASH
设置


来源:

有一个名为
APPEND\u SLASH
的Django设置,默认值为
True

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

只有在安装了CommonMiddleware的情况下才使用
APPEND\u SLASH
设置


来源:

多亏了你的评论,我可以用以下方法修复它:

urlpatterns = [
    url(r'^/?$', RedirectView.as_view(url="start"), name='index'),
    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'),
]
urlpatterns=[
url(r'^$',重定向视图。作为_视图(url=“start”),name='index'),
url(r'^(?P.+?)/?$',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'),
]
urlpatterns = [
    url(r'^$', RedirectView.as_view(url="start"), name='index'),
    url(r'^(?P<page>.+?)/?$', views.PageView.as_view(), name='page'),
]
urlpatterns=[
url(r'^$',重定向视图。作为_视图(url=“start”),name='index'),
url(r'^(?P.+?)/?$',views.PageView.as_view(),name='page'),
]

+
量词太贪婪了,所以我将其替换为非贪婪版本
+?

将您的url更改为:url(r'^(?p[-\w]+)/?$,views.PageView.as_view(),name='page'),我只更改了regx。使用“+”而不是“[-\w]+”,这应该可以。正如@anush所说,您当前的正则表达式太贪婪了,并且在
页面
的末尾也抓取了斜杠,所以
/?
部分已经不需要了,无论键入
example.com
还是
example.com/
,如果查看
http://example.com
http://example.com/
在日志中,无论是否包含斜杠,您都会看到
“GET/HTTP/1.1”
。Django在解析url之前从请求中去掉前导斜杠。因此,如果您有
r'^/$”
,它实际上将匹配
/
,这不是您想要的。在
r'^$'
中不需要前导斜杠,就像在
r'^(?.P.+)'
中不需要前导斜杠一样。Django 1.9将为这个错误和其他几个错误负责。将您的url更改为:url(r'^(?P[-\w]+)/?$',views.PageView.as_view(),name='page'),我只更改了regx。使用“+”而不是“[-\w]+”,这应该可以。正如@anush所说,您当前的正则表达式太贪婪了,并且在
页面
的末尾也抓取了斜杠,所以
/?
部分已经不需要了,无论键入
example.com
还是
example.com/
,如果查看
http://example.com
http://example.com/
在日志中,无论是否包含斜杠,您都会看到
“GET/HTTP/1.1”
。Django在解析url之前从请求中去掉前导斜杠。因此,如果您有
r'^/$”
,它实际上将匹配
/
,这不是您想要的。在
r'^$'
中不需要前导斜杠,就像在
r'^(?.P.+)'
中不需要前导斜杠一样。Django 1.9将为这个错误和其他几个错误负责。很有趣,但我的问题更多的是相反的。我希望以斜杠结尾的URL和不匹配的任何模式被重定向到没有斜杠的相同URL。有趣的是,我的问题更多的是相反的。我希望以斜杠结尾且与任何模式都不匹配的URL在没有斜杠的情况下重定向到同一URL。