**
路由系統:
URL配置(URLconf)就像Django所支撐網站的目錄. 本質是URL與該URL要調用的函數的映射表
基本格式 : from django.conf.urls import url urlpatterns = [url(正則表達式,views視圖,參數,別名) ] 參數 -- 傳給函數視圖的默認參數 (字典形式) 別名 -- 一個可選的name參數若要從URL中捕獲一個值,只需要在它周圍放置一對圓括號(分組匹配) 不需要添加一個前導的反斜杠,因為每個URL 都有。例如,應該是^articles 而不是 ^/articles 每個正則表達式前面的'r' 是可選的但是建議加上 是否開啟URL訪問地址后面不為/跳轉至帶有/的路徑的配置項 APPEND_SLASH=True(\d+) 正則表達式分組匹配(通過圓括號)來捕獲URL中的值并以位置參數形式傳遞給視圖 (?P < name > pattern),其中name是組的名稱,pattern是要匹配的模式 可以使用分組命名匹配的正則表達式組來捕獲URL中的值并以關鍵字參數形式傳遞給視圖在實際應用中,使用分組命名匹配的方式可以讓你的URLconf 更加明晰且不容易產生參數順序問題的錯誤,但是有些開發人員則認為分組命名組語法太丑陋、繁瑣URLconf 匹配的位置 *** 例如 http://www.example.com/myapp/ 請求中,URLconf 將查找 /myapp/ http://www.example.com/myapp/?page=3 請求中,URLconf 仍將查找 /myapp/ URLconf 不檢查請求的方式 換言之,所有的請求方法 -- 同一個URL的POST,GET,HEAD,等等,都將路由到相同的函數捕獲的參數永遠都是字符串 *** re匹配 match // find all // search 每個在URLconf中捕獲的參數都作為一個普通的Python字符串傳遞給視圖,無論正則表達式使用的是什么匹配方式 url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive) 傳遞到視圖函數views.year_archive() 中的year參數永遠是一個字符串類型視圖函數指定默認值
# 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 模式指向相同的 函數,但是第一個模式并沒有從url中捕獲任何東西
如果第一個匹配上了,page()函數將使用其默認參數num='1',如果第二個匹配上了,page()
將使用正則表達式捕獲到的num值
include 其他的URLconfs? --從其他地方導入urls
from django.conf.urls import include, urlurlpatterns = [url(r'^admin/', admin.site.urls),url(r'^blog/', include('blog.urls')), # 可以包含其他的URLconfs文件 ]
傳遞額外的參數給視圖函數
URLconfs 具有一個鉤子,讓你傳遞一個python 字典作為額外的參數傳遞給視圖函數
django.conf.urls.url() 可以接受一個可選的第三個參數,它是一個字典,表示想要傳遞給視圖函數的額外關鍵字參數
from django.conf.urls import url from . import viewsurlpatterns = [url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}), ]在這個例子中,對于/blog/2005/請求,Django 將調用views.year_archive(request, year='2005', foo='bar')。 當傳遞額外參數的字典中的參數和URL中捕獲值的命名關鍵字參數同名時,函數調用時將使用的是字典中的參數,而不是URL中捕獲的參數
命名URL和URL反向解析
在使用Django 項目時,一個常見的需求是獲得URL的最終形式,以用于嵌入到生成的內容中(視圖中和顯示給用戶的URL等)或者用于處理服務器端的導航(重定向等).-- 反向解析 -- 反向解析URL、反向URL 匹配、反向URL 查詢或者簡單的URL 反查在需要URL 的地方,對于不同層級,Django 提供不同的工具用于URL 反查: 1 在模板中: 使用url模板標簽 2 在python代碼中:使用django.core.urlresolvers.reverse() 函數 3 在更高層的與處理Django 模型實例相關的代碼中:使用get_absolute_url() 方法
使用 -- 給我們的URL匹配規則起個名字,一個URL模式起一個名字,只需要通過名字調用當前的URL
下面舉例:
url(r'^home', views.home, name='home'), # 給我的url匹配模式起名為 home url(r'^index/(\d*)', views.index, name='index'), # 給我的url匹配模式起名為index 后面再模板中引用: --HTML-- {% url 'home' %}在views函數中可以這樣引用 --py-- from django.urls import reverse reverse("index", args=("2018", ))
命名 空間模式
即使不同的APP使用相同的URL名稱,URL的命名空間模式也可以讓你唯一反轉命名的URL
舉例 project中的urls.py from django.conf.urls import url, includeurlpatterns = [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 viewsapp_name = 'app01' urlpatterns = [url(r'^(?P<pk>\d+)/$', views.detail, name='detail') ]app02中的urls.py from django.conf.urls import url from app02 import viewsapp_name = 'app02' urlpatterns = [url(r'^(?P<pk>\d+)/$', views.detail, name='detail') ]現在,我的兩個app中 url名稱重復了,我反轉URL的時候就可以通過命名空間的名稱得到我當前的URL 下面是語法: '命名空間名稱:URL名稱' 模板中使用: -html- {%url 'app01:detail' pk=12 pp=99 %} views 中函數使用 -py- v = reverse('app01:detail',kwargs={'pk':11})
https://www.cnblogs.com/maple-shaw/articles/9282718.html -- 路由--
?