路由系統
阿新 • • 發佈:2017-05-28
模板 resp solver max quest 空間 new 不同的 查看
路由系統
根據Django約定,一個WSGI應用裏最核心的部件有兩個:路由表和視圖。Django框架 的核心功能就是路由:根據HTTP請求中的URL,查找路由表,將HTTP請求分發到 不同的視圖去處理:
路由系統分類很多,常見的有基本單一路由,正則路由,帶額外參數路由,二層三層路由還有通過反射機制來完成的動態路由。
1、單一路由
url(r‘^index$‘, views.index),
2、基於正則的路由
url(r‘^index/(\d*)‘, views.index), url(r‘^manage/(?P<name>\w*)/(?P<id>\d*)‘, views.manage),
3、添加額外的參數
url(r‘^manage/(?P<name>\w*)‘, views.manage,{‘id‘:333}),
4、為路由映射設置名稱
url(r‘^home‘, views.home, name=‘h1‘), url(r‘^index/(\d*)‘, views.index, name=‘h2‘),
設置名稱之後,可以在不同的地方調用,如:
- 模板中使用生成URL {% url ‘h2‘ 2012 %}
- 函數中使用生成URL reverse(‘h2‘, args=(2012,)) 路徑:django.urls.reverse
- Model中使用獲取URL 自定義get_absolute_url() 方法
class NewType(models.Model): caption = models.CharField(max_length=16) def get_absolute_url(self): """ 為每個對象生成一個URL 應用:在對象列表中生成查看詳細的URL,使用此方法即可!!! :return: """ # return ‘/%s/%s‘ % (self._meta.db_table, self.id)View Code# 或 from django.urls import reverse return reverse(‘NewType.Detail‘, kwargs={‘nid‘: self.id})
獲取請求匹配成功的URL信息:request.resolver_match
5、根據app對路由規則進行分發
url(r‘^web/‘,include(‘web.urls‘)),
6、命名空間
a. project.urls.py
from django.conf.urls import url,include urlpatterns = [ url(r‘^a/‘, include(‘app01.urls‘, namespace=‘author-polls‘)), url(r‘^b/‘, include(‘app01.urls‘, namespace=‘publisher-polls‘)), ]
b. app01.urls.py
from django.conf.urls import url from app01 import views app_name = ‘app01‘ urlpatterns = [ url(r‘^(?P<pk>\d+)/$‘, views.detail, name=‘detail‘) ]
c. app01.views.py
def detail(request, pk): print(request.resolver_match) return HttpResponse(pk)
以上定義帶命名空間的url之後,使用name生成URL時候,應該如下:
- v = reverse(‘app01:detail‘, kwargs={‘pk‘:11})
- {% url ‘app01:detail‘ pk=12 pp=99 %}
django中的路由系統和其他語言的框架有所不同,在django中每一個請求的url都要有一條路由映射,這樣才能將請求交給對一個的view中的函數去處理。其他大部分的Web框架則是對一類的url請求做一條路由映射,從而是路由系統變得簡潔。
路由系統