urls.py文件就是路由層,與視圖層有一一對應關係的html
路由匹配是按照正則匹配,url方法中第一個參數是正則表達式,一旦匹配到內容就會馬上執行對應的視圖函數前端
urlpatterns = [ url(r'^admin/', admin.site.urls), # 首頁匹配 url(r'^$', views.home), # ^ 是以什麼開頭,$ 是以什麼結尾 url(r'^test/', views.test), # 不加 / Django會自動加上,會發送兩次請求第一次重定向到加/的請求url上,能夠在配置文件中修改此配置 # APPEND_SLASH = True/False url(r'^test_add', views.test_add) ]
分組:就是給一段正則表達式加括號python
無名分組:在路由匹配的時候給某段正則表達式加括號,匹配的時候會將括號內的正則表達式匹配到的內容當作位置參數傳遞給對應的視圖函數正則表達式
# 無名分組 url(r'^test/([0-9]{4})/',views.test) # 視圖函數,須要用一個位置參數接收url正則內無名分組的內容 def test(request,args): return HttpResponse('test')
有名分組:給一段正則表達式加括號,括號內用 ?P<名字> 做爲分組的名字,把括號裏面的內容當作關鍵字參數傳遞給視圖函數django
# 有名分組 url(r'^test_add/(?P<name>[0-9]{4})', views.test_add), # 視圖函數,須要接收一個關鍵字參數與url傳遞的關鍵字參數同樣 def test_add(request, name): return HttpResponse('test_add')
無名分組和有名分組不能混合使用,可是同一種命名方式可使用多個後端
url(r'^test/([0-9]{2})/(\d+)/',views.test), url(r'^test/(?P<name>\d+)/(?P<year>[0-9]{3})/',views.test),
經過一些方法,可以獲得一個結果,該結果能夠訪問到對應的url,當項目中後端和前端不少地方都要使用url路徑中的參數,而爲了調轉url不會影響後端views和前端的代碼,給這個url起一個別名,至關於動態綁定就是反向解析app
一、先在路由與視圖函數對應關係中起一個名字,name函數
url(r'^test/', views.test, name = 'add')
二、後端解析,先導入模塊reverse,再調用該模塊網站
from django.shortcuts import render,HttpResponse,redirect,reverse reverse('add') # 拿到url綁定name='add'的url地址
三、前端解析ui
{% url 'add' %} # 拿到url綁定name='add'的url地址
一、路由層,給無名分組的 url 起別名,name
url(r'^testadd/(\d+)/',views.testadd,name='add')
二、後端解析,須要指定位置參數數字,與url分組中輸入的數字位數相同便可,這個數字通常是數據的主鍵
reverse('add',args=(12,)) # args中是元組,數字位數要與url中分組輸入的相同
三、前端解析,須要屬於一個數字與url中輸入的數字位數相同,這個數字通常是數據的主鍵
{% url 'add' 11 %} # 數字要與url中輸入的數字位數相同
一、路由層,給有名分組的 url 起別名,name
url(r'^test/[0-9]{2}/', views.test, name='test_id')
二、後端解析,須要一個關鍵字參數接收分組中與url中分組輸入的數字位數相同的數,這個數字通常是數據的主鍵
reverse('add', kwargs={'test_id':11}) reverse('add', args=(11,)) # 可使用位置參數接收,推薦使用
三、前端解析,須要指定一個關鍵字參數來接收數據位數相同的數,這個數字通常是數據的主鍵
{% url 'add' test_id=11 %} {% url 'add' 11 %} # 可使用無名分組反向解析的方法,推薦使用
當Django項目比較龐大時,路由與視圖函數對應關係太多,總路由代碼會很冗長,很差維護,Django支持每個app均可以有本身的urls.py ,而且總路由不要作路由與視圖函數的對應關係了只作分發任務的操做
根據請求不一樣,識別是哪一個app,而後自動將下發到對應的app下的urls.py文件中再作與視圖函數對應關係,每一個app不只能夠有本身的urls.py 還能夠有static文件夾,templates文件夾,便於分小組開發
一、總路由,須要分發模塊 include()
注意:在路由分發時,應用名後不能加$
from django.conf.urls import url,include # 路由分發 注意事項應用名後面千萬不能加$ # from app01 import urls as app01_urls # from app02 import urls as app02_urls # url(r'^app01/',include(app01_urls)), # url(r'^app02/',include(app02_urls)) # 簡寫, 使用這種 url(r'^app01/',include('app01.urls')), url(r'^app02/',include('app02.urls'))
二、子路由,在子路由中urls中寫與視圖函數對應關係
from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^index/',views.index) ]
當咱們的項目有多個app時,而且每一個app下都針對匹配的路徑起了別名,當別名相同時,那麼在反向解析時就會出現覆蓋,解決這個問題就是避免起名重複,或者使用Django的名稱空間
一、在總路由分發時,指定名稱空間, namespace
url(r'^app01/',include('app01.urls',namespace='app01')) url(r'^app02/',include('app02.urls',namespace='app02'))
二、後端解析
reverse('app01:index') reverse('app02:index')
三、前端解析
{% url 'app01:index' %} {% url 'app02:index' %}
通常咱們起別名時加上應用名做爲前綴就不會出現此問題了
url(r'^index/',views.index,name='app01_index') url(r'^index/',views.index,name='app02_index')
咱們想針對不一樣的項目,只安裝項目所須要的功能模塊,項目不用的不安裝,來避免加載資源的耗時,就建立一個虛擬環境
建立虛擬環境就相似於裝一個純淨的python解釋器,全部每建立一個虛擬環境,就至關於從新下載一個python解釋器,不推薦使用太多,會佔硬盤內存
1.x版本路由層用的是url,第一個參數使用的正則表達式
2.x版本路由層用的是path,不支持使用正則表達式,可是2.x和3.x版本提供了re_path等價於1.x版本中的url功能
雖然path不支持正則表達式可是提供了五種默認的轉換器
str,匹配除了路徑分隔符(/)以外的非空字符串,這是默認的形式 int,匹配正整數,包含0。 slug,匹配字母、數字以及橫槓、下劃線組成的字符串。 uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。 path,匹配任何非空字符串,包含了路徑分隔符(/)(不能用?)
除了默認的五種表達式還支持自定義的轉換器
class MonthConverter: regex='\d{2}' # 屬性名必須爲regex def to_python(self, value): return int(value) def to_url(self, value): return value # 匹配的regex是兩個數字,返回的結果也必須是兩個數字
僞靜態:url以.html結尾給人的感受像是文件中的,寫死的,內容不會輕易的改變,其實本質就是將路由層的第一個參數名換成了以.html 結尾
僞靜態做用:爲了提升你的網站的搜索引擎的力度,提供網站的SEO查詢效率