在阅读Real Django时,看了对url匹配的说明,自己去验证了一下,并且发现了/
符号的作用。
两者区别
1 | url(r'panda', ...) |
不仅会匹配”/panda”,同时也会匹配诸如 “/panda3d”, “/3dpanda”
为了仅仅匹配 “/panda”,必须要用这种方式
1 | url(r'^panda', ...) |
具体表现
看完了上面的描述,很自然的也想验证下$
字符在路由用法时的作用,作用应该类似。
具体的验证包括:
url(r'panda', ...)
是否同时匹配"/panda"
,"/panda3d"
和 “/3dpanda"
url(r'^panda', ...)
这种写法只匹配"/panda"
url(r'^panda$', ...)
的作用^
和$
在不同级的路由中的作用
环境准备
使用了基于django 1.11.14进行验证。
项目和应用路由都不带^
应用路由1
2
3urlpatterns = [
url(r'home', views.index, name='index'),
]
项目路由1
2
3urlpatterns = [
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
3urlpatterns = [
url(r'home', views.index, name='index'),
]
项目路由1
2
3urlpatterns = [
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'),