1. 程式人生 > >路由系統

路由系統

模板 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)
# from django.urls import reverse return reverse(NewType.Detail, kwargs={nid: self.id})
View Code

獲取請求匹配成功的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請求做一條路由映射,從而是路由系統變得簡潔。

路由系統