Django 路由系統

Django 路由系統

基本格式

from django.conf.urls import url
urlpatterns = [
url(正則表達式, views視圖函數,參數,別名),
]

 

參數說明

正則表達式:一個正則表達式字符串
views視圖函數:一個可調用對象,一般爲一個視圖函數或一個指定視圖函數路徑的字符串
參數:可選的要傳遞給視圖函數的默認參數(字典形式)
別名:一個可選的 name 參數

 

 

 

路由匹配方式  

正則表達式的模糊匹配
分組匹配 ()
--> 至關於給視圖函數傳遞位置參數
分組命名匹配 (
?P<name>正則表達式) --> 至關於給視圖函數傳遞關鍵字參

注意:
  1. 分組匹配和分組命名匹配不能混合使用html

  2. URLconf 匹配的位置 : 無視域名和參數python

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

 

  3. URLconf 不檢查請求的方法 正則表達式

  4. 捕獲的參數永遠都是字符串django

  5. 視圖函數中可指定默認值app

# 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

 

 

正則表達式詳解

基本示例

from django.urls import re_path
from app01 import views     
urlpatterns = [
re_path(r'articles/2003/$', views.special_case_2003), # 靜態路由
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), # 動態路由 re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), # 動態路由 re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$', views.article_detail), # 動態路由 ] 

 

注意事項函數

  • urlpatterns中元素按照從上往下逐一匹配正則表達式,匹配成功則再也不繼續
  • 若要從URL中捕獲一個值,只須要在它周圍放置一對圓括號(分組匹配)
  • 最前面不須要加一個反斜線
  • 每一個正則表達式前面的'r' 是可選的可是建議加上

補充說明url

# 是否開啓URL訪問地址後面不爲/跳轉至帶有/的路徑的配置項
APPEND_SLASH=True

Django settings.py配置文件中默認沒有 APPEND_SLASH 這個參數spa

 系統默認爲True, 其做用就是自動在網址結尾加 '/'code

# urls.py:
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^blog/$', views.blog),
]
# 訪問 http://www.example.com/blog 時,默認將網址自動轉換爲 http://www.example/com/blog/ 。
# 若是在settings.py中設置了 APPEND_SLASH=False,
# 此時咱們再請求 http://www.example.com/blog 時就會提示找不到頁面。

  

分組命名匹配

基本語法

(?P<name>pattern)

 

實現功能

捕獲的值做爲關鍵字參數而不是位置參數傳遞給視圖函數htm

示例

# urls中:
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),


# views中: views.month_archive(request, year="2017", month="12")

 

  

 

include 路由分流

引入其餘 urls.py 文件

  當多個app的時候能夠再 各app內部建立本身 urls.py 

  在總的urls 中須要 導入分流的各app內部的urls.py

引入方式

from django.cinf.url import url,include

 

工做原理

當請求來了由主urls進行匹配,匹配到子urls後由子urls進行下一步匹配

 

示例

from django.conf.urls import include, url
from app01 import url
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/', include('app01.urls')), # 能夠包含其餘的URLconfs文件 ] 
# 當一個 app01/xxxx 的路徑請求來了以後 會首先匹配到 ^app01/ 然後轉向 app01.url 繼續下一步匹配

 

 

反向解析 URL

本質上就是給url匹配模式起別名,而後用過別名拿到具體的URL路徑

 

起別名     

在url匹配模式中,定義name="別名"

url(r'^home', views.home, name='home'),         # 給url匹配模式起名爲 home
url(r'^index/(\d*)', views.index, name='index'),   # 給url匹配模式起名爲index

 

 

經過別名拿到具體路徑

 

1. 模板語言中:

// 直接取到路徑
{% url "別名" %}    // 經過別名拿到具體路徑
// 若是urls中有位置參數或者關鍵字參數
{% url "別名" 2018 "nb" %}

 

2. 視圖函數中

# 首先要導入
django.utils import reverse


# 直接取到路徑:
reverse("別名")    # 經過別名拿到具體路徑


#  若是urls中有位置參數或者關鍵字參數,依然能夠傳值
    # 傳位置參數:
reverse("別名", args=(2018, "nb"))    
    # 傳關鍵字參數:
reverse("別名" kwargs={"year": 2018, "title": "nb"})

 

  

 

命名空間

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

示例

#  project中的urls.py
from django.conf.urls import url, include
urlpatterns = [
url(r'^app01/', include('app01.urls', namespace='app01')),
url(r'^app02/', include('app02.urls', namespace='app02')),
]

#  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')
]

#  app02中的urls.py
from django.conf.urls import url
from app02 import views    
app_name = 'app02'
urlpatterns = [
url(r'^(?P<pk>\d+)/$', views.detail, name='detail')
]

 

 

場景分析

app01 和 app02 中都有相同的 別名 "detail" 

boss 打滾ing : 我就是想要同樣的

在用別名回調url的時候會衝突, 此時須要另外一種方式進行區分

 

工做原理

爲了區分,在總的 urls 上作命名空間,

在原有的別名基礎上須要加上命名空間的預約值才能夠正確取到路徑

 

// 模板中使用:
{% url 'app01:detail' pk=12 pp=99 %}


# views中的函數中使用
v = reverse('app01:detail', kwargs={'pk':11})
相關文章
相關標籤/搜索