Django路由系統

Django路由系統

1.路由系統

  • URl配置(URLconf)就像Django所支撐網站的目錄,它的本質是URL與該URL調用的視圖函數之間的映射關係正則表達式

2.URLconf配置

  • 基本格式django

    •  from django.conf.urls import url
       
       urlpatterns = [
            url(正則表達式, views視圖,參數,別名),
       ]
  • 參數說明:瀏覽器

    • 正則表達式:一個正則表達式字符串服務器

    • views視圖: 一個可調用對象,一般爲一個視圖函數\參數: 可選的要傳遞給視圖函數的默認參數(字典形是)app

    • 別名: 一個可選的name參數函數

  • 2.0版本的django格式工具

    •  from django.urls import path,re_path
       
       urlpatterns = [
          path('articles/2003/', views.special_case_2003),
          path('articles/<int:year>/', views.year_archive),
          path('articles/<int:year>/<int:month>/', views.month_archive),
          path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
       ]
    • 其中re_path與1.11版本的url是同樣的用法網站

3.正則表達式詳解

  • 基本配置url

    •  from django.conf.urls import url
       
       from . import views
       
       urlpatterns = [
          url(r'^articles/2003/$', views.special_case_2003),
          url(r'^articles/([0-9]{4})/$', views.year_archive),
          url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
          url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
    • 注意事項spa

      • urlpatterns中的元素哪找書寫順序從上往下逐一匹配正則表達式,一旦匹配成功就不在繼續

      • 若要從URL中捕獲一個值,只須要在它的周圍放置一對圓括號<>(分組匹配)

      • 不須要添加提個前導的反斜槓,由於每一個URL都有,例如應該是^articles而不是^/articles

      • 每一個正則表達式前面的'r'是可選的,可是建議加上

    • 補充說明

      • APPEND_SLASH=True

      • django settings.py配置文件中沒有這個參數,可是Django默認這個參數爲True,其做用就是自動的在網址的末尾加"/「

      • 若是設定其爲False,當訪問網頁時不本身加" / ",就會提示找不到該頁面

4.分組命名匹配

  • 分組匹配使用簡單的正則表達式經過圓括號來捕獲URL中的值並以位置參數的形式傳遞給視圖,

  • 更高級的是以分組命名匹配的正則表達式來捕獲URl的值,並以關鍵字參數的方式傳遞給視圖

  •  from django.conf.urls import url
     
     from . import views
     
     urlpatterns = [
        url(r'^articles/2003/$', views.special_case_2003),
        url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
        url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
        url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
     ]
  • 與前面的示例的不一樣就在於捕獲的值做爲關鍵字參數而不是位置參數傳遞給視角函數

    • 例如,針對URL /articles/2017/12/至關於按如下方式調用視圖函數:

    •  views.month_archive(request, year="2017", month="12")
    • 優勢:讓你的URLconf更加清晰明確且不容易產生參數順序問題的錯誤,

    • 缺點: 語法犯了罪,由於醜是原罪

  • URLconf匹配的位置

    • URLconf在請求的URL上查找,將它當作一個普通的Python字符串,不包括GET和POST參數以及域名

    • 例如,http://www.example.com/myapp/ 請求中,URLconf 將查找 /myapp/ 。

      http://www.example.com/myapp/?page=3 請求中,URLconf 仍將查找 /myapp/ 。

    • URLconf 不檢查請求的方法。換句話講,全部的請求方法 —— 同一個URL的POSTGETHEAD等等 —— 都將路由到相同的函數。

  • 捕獲的參數永遠都做爲一個普通的字符串傳遞給視圖,不管正則表達式用什麼匹配方式

5.視圖函數

  • 視圖函數中指定默認值

    •  # urls.py中
       from django.conf.urls import url
       
       from . import views
       
       urlpatterns = [
          url(r'^blog/$', views.page),
          url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
       ]
       
       # views.py中,能夠爲num指定默認值
       def page(request, num="1"):
          pass
    • 在上面的例子中,兩個URl模式指向的是同一個視圖函數,可是第一個模式沒有捕獲任何東西,當他匹配上了,默認num = '1',若是第二個模式匹配上了,num將等於正則表達式捕獲到的num值

    • 傳遞額外的參數給視圖參數

      • URLconfs 具備一個鉤子,讓你傳遞一個Python 字典做爲額外的參數傳遞給視圖函數。

      • django.conf.urls.url() 能夠接收一個可選的第三個參數,它是一個字典,表示想要傳遞給視圖函數的額外關鍵字參數。

      • 例如

        •  from django.conf.urls import url
           from . import views
           
           urlpatterns = [
              url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
           ]

6.路由分配

  • 能夠找到其餘app下的URLconf

  • include其餘的URLconfs

    •  urlpatterns = [
          url(r'^admin/', admin.site.urls),
          url(r'^blog/', include('app01.urls')), # 能夠包含其餘的URLconfs文件
       ]

7.命名URL和URL反向解析

  • 使用Django項目時,一個常見的需求就是獲取URl的最終形式,以用於嵌入到生成的內容中(視圖中和顯示給用戶的URl等,或用於處理服務器端的導航(重定向)

  • Django提供一個方法是讓URL映射是URl設計惟一的地方,你填充你的URLconf,而後能夠雙向使用他:

    • 根據用戶/瀏覽器發起的URL請求,它調用正確的Django視圖,並從URL中提取它的參數須要的而值

    • 根據Django視圖的標識和將要傳遞給它的參數的值,獲取與之關聯的URL,這就是反向解析URL,反向URL匹配,反向URL查詢或簡單的URL反查

  • 在須要URL的地方,對於不一樣的層級,Django提供了不一樣的工具用於URL反查

    • 在模板中:使用URL模板標籤

    • 在Python代碼中:使用django.core.urlresolvers.reverse() 函數。

    • 在更高層的與處理Django相關模型實例相關代碼中,使用get_absolute_url()方法

  • 總結:簡單的說就是能夠給咱們的URL匹配規則起一個名字,一個規則一個名字,這樣就能夠經過名字來調用當前的URL

    • 例如:

    •  url(r'^home', views.home, name='home'),  # 給個人url匹配模式起名爲 home
       url(r'^index/(\d*)', views.index, name='index'), # 給個人url匹配模式起名爲index
    • 在模板中能夠這樣用

      •  {% url 'home' %}
    • 在views函數中能夠這樣引用

      •  from django.urls import reverse
         
         reverse("index", args=("2018", ))
    • 在某些場景中,一個視圖是能夠通用的,因此在URL和視圖之間存在一對多的關係,對於這些狀況,只有視圖的名字還不厚

  • 注意

    • 爲了完成上面例子中的URL 反查,你將須要使用命名的URL 模式。URL 的名稱使用的字符串能夠包含任何你喜歡的字符。不僅限制在合法的Python 名稱。

      當命名你的URL 模式時,請確保使用的名稱不會與其它應用中名稱衝突。若是你的URL 模式叫作comment,而另一個應用中也有一個一樣的名稱,當你在模板中使用這個名稱的時候不能保證將插入哪一個URL。

      在URL 名稱中加上一個前綴,好比應用的名稱,將減小衝突的可能。咱們建議使用myapp-comment 而不是comment

8.命名名稱空間

  • 即便在不一樣APP使用相同的URL名稱,URL的命名空間模式也可讓你惟一反轉命名的URL

  • 語法:

    • '命名空間名稱:URL名稱'

      模板中使用:

       {% url 'app01:detail' pk=12 pp=99 %}

      views中的函數中使用

       v = reverse('app01:detail', kwargs={'pk':11})

      這樣即便app中URL的命名相同,我也能夠反轉獲得正確的URL了。

  • 注意:若是不加APP名稱前綴,後面的APP的URL名稱會覆蓋前面的名稱,空間中只有一個URL名稱,懂了吧

相關文章
相關標籤/搜索