Django Url 的匹配

在阅读Real Django时,看了对url匹配的说明,自己去验证了一下,并且发现了/符号的作用。

两者区别

1
url(r'panda', ...)

不仅会匹配”/panda”,同时也会匹配诸如 “/panda3d”, “/3dpanda”

为了仅仅匹配 “/panda”,必须要用这种方式

1
url(r'^panda', ...)

具体表现

看完了上面的描述,很自然的也想验证下$字符在路由用法时的作用,作用应该类似。

具体的验证包括:

  1. url(r'panda', ...)是否同时匹配"/panda""/panda3d"和 “/3dpanda"
  2. url(r'^panda', ...)这种写法只匹配"/panda"
  3. url(r'^panda$', ...)的作用
  4. ^$在不同级的路由中的作用

环境准备

使用了基于django 1.11.14进行验证。

项目和应用路由都不带^

应用路由

1
2
3
urlpatterns = [
url(r'home', views.index, name='index'),
]

项目路由

1
2
3
urlpatterns = [
url(r'polls', include('poll.urls')),
]

发现如下几种情况都能正常匹配

  • http://127.0.0.1:8000/polls/home
  • http://127.0.0.1:8000/apolls/home
  • http://127.0.0.1:8000/apollsb/home

甚至如下情形都能匹配到:

  • http://127.0.0.1:8000/apollsb/asdfasdfhome
  • http://127.0.0.1:8000/apollsb/asdfasdfhomeasdf

可以看到,如果没有^约束前部的话,只要路由中出现了该字符,django就能匹配到

仅应用路由不带^

应用路由

1
2
3
urlpatterns = [
url(r'home', views.index, name='index'),
]

项目路由

1
2
3
urlpatterns = [
url(r'^polls', include('poll.urls')),
]

发现如下几种情况都能正常匹配

  • http://127.0.0.1:8000/polls/home
  • http://127.0.0.1:8000/polls/asdfasdfhome
  • http://127.0.0.1:8000/polls/asdfasdfhomeasdf

而如下情形不能匹配了:

  • http://127.0.0.1:8000/apolls/home
  • http://127.0.0.1:8000/apollsb/home

但是如下路由还是可以匹配

  • http://127.0.0.1:8000/pollsb/home

对$的验证

^约束开头,而$约束结尾,因此表现和如上两种情况相同。

对项目路由结尾的约束

通过$和^能很好的路由的每个段的开头和结尾,但是仅用这两个字符无法约束中间url的匹配。

也就是,当路由这么设置时

  • 项目路由: url(r'^polls', include('poll.urls'))
  • 应用路由:url(r'home$', views.index, name='index'),

http://127.0.0.1:8000/pollsb/home/仍然可以正常访问


而当这样设置时:

  • 项目路由: url(r'^polls$', include('poll.urls'))
  • 应用路由:url(r'home$', views.index, name='index'),

正常的路由也无法访问


如果要做到

  • http://127.0.0.1:8000/pollsb/home/不可访问
  • http://127.0.0.1:8000/polls/home/可访问

要这样写:

  • 项目路由: url(r'^polls/', include('poll.urls'))
  • 应用路由:url(r'home$', views.index, name='index'),

相关资料

0%