为什么不在django中包含url正则表达式检查字符串的结尾

时间:2015-06-29 20:35:16

标签: python django django-urls

假设您有一个完整的网址localhost:thisdir/callview/

我注意到在urls.py文件中,包含的命名空间写为:

(r'^thisdir/', include('thisdir.urls', namespace='thisdir)),

其中检查起始字符串但不结束,并且视图调用完成如下:

(r'^callview/$', 'thisdir.views.index', name='myview')

使用$来检查字符串的结尾。如果include模式在完整url中打破“thisdir /”以首先检查该部分,并且我认为它一次检查每个字符串部分(所以“thisdir /”在字符串的末尾)为什么我从未看到{ {1}}

谢谢

1 个答案:

答案 0 :(得分:9)

https://docs.djangoproject.com/en/1.8/topics/http/urls/

  

请注意,此示例中的正则表达式没有$(字符串结尾匹配字符),但包含尾部斜杠。每当Django遇到include()(django.conf.urls.include())时,它会切断匹配到该点的URL的任何部分,并将剩余的字符串发送到包含的URLconf以进行进一步处理。

如果您使用$终止了包含,那么该规则将不再匹配所包含文件中的任何内容,因为它只匹配以恰好包含正则表达式结尾的网址。

你永远不会看到它的原因是因为它会阻止URL包含的目的。

(r'^thisdir/$', <include>)由于终止thisdir/匹配的网址等于$。因此,thisdir/foobar/等网址将不匹配,且永远不会被包含。

另一方面,如果您将$从正则表达式中删除,/thisdir/<anything>将与正则表达式匹配,因此可以通过包含的网址进一步处理。