Django路由匹配

先抛出一个问题

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'test', views.test),
    url(r'testadd', views.testadd),
def test(request):
    return HttpResponse('test')

def testadd(request,year):
    return HttpResponse('testadd')

当我们访问test的时候,返回的页面内容是 test 没有问题。

但是当我们访问testadd 的时候,返回的页面内容居然也是 test 。

这是因为 urls 里面不是单纯的匹配,而是正则匹配。

并且在这里面搜索顺序是自上而下,一旦找到满足的,后面的就不再执行了,我们输入的 test毫无疑问匹配到了 urls 里的 test ,但是,我们的 testadd 也满足 test 的正则表达,所以也走了这一条,因此我们两次请求的页面都是同一个。

为此,需要解决这个问题,我们要在他的前面加上斜杆

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'test/', views.test),
    url(r'testadd/', views.testadd),

这就解决了这个问题。

一个非常重点:我们在浏览器里面输入连接的时候,后缀比如说是 test,没有输入斜杆,最后发现回车之后确实访问到了我们要的界面,而且url后面自动加了一个“/” 。这不是浏览器给我们加的,是Django给我们加的,首先没有加上斜杆的时候,已经在 urls 里面搜索匹配了一次,然后Django发现没有匹配上的,于是他就给我们加了个斜杆,然后才匹配上的,所以这前后一共进行了两次http请求,可以在浏览器的 f12 里面的network里面看,确实是有两次请求,一次成功,状态码是200,一次是失败状态码是302,也就是django给我们自动重定向了,在后面加了个“/“。

如果想要取消django自动加斜杆的这个机制,可以在 settings 里面修改,在最后面加上一个

APPEND_SLASH = False #默认是True,所以会加“/”。

现在又有新的问题了,我在发送一个这样的请求 “127.0.0.1:8001/asdfasdfatest/”,没想到结果居然成功了,这是因为正则匹配嘛,里头不还是有个test,依然能够匹配上的,可以推断的是,我们在test/后面乱加东西,也不会影响,依然能够访问到,这显然不是我们要的结果。

所以,在urls 里面, 前面加尖括号,后面加美元符,就能够解决了,也就是要以这个开头,以这个结尾。

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^test/$', views.test),
    url(r'^testadd/$', views.testadd),

完美解决了。

url(r'^$', views.home),  # 首页
url(r'',views.errors)  # 404页面

404页面,也是尾页,不推荐使用,因为在我们我们第一次如果没有加上斜杆去请求 test之类的,会先走一次,这就直接进了404了,都走不了第二次,所以不推荐使用。

posted @ 2019-10-22 21:16  chanyuli  阅读(674)  评论(0编辑  收藏  举报