1. 程式人生 > >Django 路由層

Django 路由層

簡單路由配置

url(r'^admin/',admin.site.urls),
url(r'^admin/(?P<id>\d+.html)',views.admin),

第一個引數是正則表示式(如果要精確匹配 ‘^admin/$’),第二個引數是檢視函式(不能加括號)


無名分組

按位置傳參,分組之後,會把分組出來的資料,當位置引數,傳到檢視函式中,所以,檢視函式需要定義形參

url(r'^login/([0-9]{4})/([0-9]{2})$',views.login), #urls.py檔案內配置
def login(request,num1,num2): #views檢視函式可以這樣接收

有名分組

按關鍵字傳參,有名分組之後會把分組出來的資料,當關鍵字引數,傳到檢視函式中,所以,檢視函式需要定義形參,形參名字要和分組的名字對應,與順序無關

url(r'^publish/(?P<year>[0-9]{4})/(?P<mounth>[0-9]{2})/$', views.publish),
def publish(request, mounth,year):
有名分組和無名分組 不能混用

反向解析

​ 反向解析基本用於路由重定向,當出現大量的路由需要配置的時候可以使用反向解析一條語句就可以解決,用於:例如圖書展示當點選圖書進入新的頁面進行展示但是路由只需要 1 2 3...進行匹配的時候就可以反向解析不需要路由重新配置

先在urls裡命一個名:
    1 無引數:url(r'^publishadd133/$', views.publishadd,name='ddd'),
    2 無名分組:url(r'^publishadd/([0-9]{4})/([0-9]{2})/$', views.publishadd,name='ddd'),
    3 有名分組:url(r'^publishadd/(?P<year>[0-9]{4})/(?P<mounth>[0-9]{2})/$',views.publishadd,name='ddd'),
在模板層:
        1 無引數:<a href="{% url 'ddd' %}">點我</a>  
        2 無名分組的:<a href="{% url 'ddd' 2018 12 %}">點我</a>    
        3 有名分組:<a href="{% url 'ddd' 2018 12 %}">點我</a>   
            還可以 <a href="{% url 'ddd' year=2018 mounth=12 %}">點我</a>    
在檢視層:
        from django.shortcuts import reverse
        在檢視函式裡:
        1 無引數:url=reverse('ddd')
        1 無名分組:url=reverse('ddd',args=(2018,12,))
        1 有名分組:url=reverse('ddd',args=(2018,12,)) 還可以 url=reverse('ddd',kwargs={'year':2018,'mounth':12})
        return redirect(url)

路由分發

1 在不同的app裡建立urls.py
    ①app01內urls.py
         url(r'^publish/$', views.publishadd,name='app01_test'),
    ②blog內urls.py
         url(r'^blogtest/$', views.test,name='test'),
2 在總路由 
    from django.conf.urls import include 
    url(r'^blog/',include('blog.urls')),
    url(r'^app01/',include('app01.urls')),
3 在不同的app的urls裡配置路由關係   
***重點***總路由,不能加結束符$

名稱空間

名稱空間的一般是因為反向解析的name命名重疊,在urls總路由內用namespace配置

如果使用名稱空間,反向解析的檢視層和模板層都應該修改

6 名稱空間
    url(r'^blog/',include('blog.urls',namespace='blog')),
    子路由:url(r'^publish/$', views.publish,name='test'),
    反向解析:
        檢視層:url = reverse('blog:test')
        模板層:{% url 'blog:test'%}
***不建議使用名稱空間***
如下面的語句直接在反向解析的時候規範命名就可以
    子路由:url(r'^publish/$', views.publish,name='app01_test'), 

偽靜態

路由:url(r'^book/(?P<id>\d+.html)',views.book),
訪問:http://127.0.0.1:8000/book/4.html