Django路由層
路由匹配
# url方法第一個(gè)參數(shù)是正則表達(dá)式,并且按順序匹配視圖函數(shù)
url(r'test', views.test),
url(r'testxxx', views.testxxx),
# 使用'/'來阻止此類情況
url(r'test/', views.test),
url(r'testxxx/', views.testxxx),
# 當(dāng)用戶輸入的url后綴缺少'/'時(shí),django自動(dòng)加斜杠
# 取消自動(dòng)加斜杠 settings.py
APPEND_SLASH = False
# 使用'^'和'$'來規(guī)范路徑
url(r'^test/$', views.test),
url(r'^testxxx/$', views.testxxx),
# 匹配首頁
url(r'^$', views.test),
# 匹配404
使用異常捕獲比較靠譜
無名分組
# 分組,即使用'()'包括某一段正則表達(dá)式
url(r'^test/(\d+)/', views.test),
# url函數(shù)會(huì)將第一個(gè)參數(shù)中使用'()'獨(dú)立分組的正則表達(dá)式也作為位置參數(shù)傳入視圖函數(shù)
有名分組
url(r'^test/(?P<re_name>\d+)/', views.test),
# 即將'()'內(nèi)正則表達(dá)式以其別名為關(guān)鍵字作為關(guān)鍵字參數(shù)傳入視圖函數(shù)
# 無名分組與有名分組不能混用,但可以重用
反向解析
# 通過某些方法直接訪問路由中設(shè)置的url觸發(fā)視圖函數(shù) eg: 通過給url傳入第三個(gè)關(guān)鍵字參數(shù)'name='為當(dāng)前路徑設(shè)置別名,然后通過前段或者后端使用別名替換直接路徑實(shí)現(xiàn)路徑在各個(gè)文件間解耦合效果,別名不能沖突
url(r'^something/', views.something,name='反向解析嘗試'),
# 前端反向解析
<a href="{% url '反向解析嘗試' %}">去something頁面1</a>
# 后端反向解析 views.py
from django.shortcuts import render, HttpResponse, redirect, reverse
reverse('反向解析嘗試') # 返回路由中對(duì)應(yīng)的url
無名分組反向解析
url(r'^re_test/(\d+)/', views.re_test, name='re_test1'),
# 無名分組后端反向解析,即:將可以匹配到'()'內(nèi)正則的值作為args參數(shù)傳入reverse()函數(shù),一般我們可以用數(shù)據(jù)主鍵值
def home(request):
print(reverse('re_test1',args=(1,)))
return render(request,'home.html')
# 無名分組前端反向解析,類似于后端,在引用url別名處添加可以匹配到'()'內(nèi)正則的值,一般我們可以用數(shù)據(jù)主鍵值
<a href="{% url 're_test1' 1 %}">去something頁面1</a>
有名分組反向解析
url(r'^re_testx/(?P<age>\d+)/', views.re_test2, name='re_test2'),
# 有名分組后端反向解析
print(reverse('re_test2', kwargs={'age':1})) # 或
print(reverse('re_test2',args=(1,)))
# 有名分組前端反向解析
<a href="{% url 're_test2' age=1 %}">去something頁面1</a> #或
<a href="{% url 're_test2' 1 %}">去something頁面1</a>
路由分發(fā)
# 每一個(gè)應(yīng)用都可以有自己的templates文件夾、urls.py、static文件夾
# 項(xiàng)目urls.py配置(基礎(chǔ)方式)
from django.conf.urls import url, include
from app02 import urls as app02_urls
from app03 import urls as app03_urls
urlpatterns = [
url(r'^app02/',include(app02_urls)),
url(r'^app03/',include(app03_urls))
]
# 項(xiàng)目urls.py配置(簡(jiǎn)單方式)
from django.conf.urls import url, include
urlpatterns = [
url(r'^app02/',include('app02.urls')),
url(r'^app03/',include('app03.urls'))
] # Django會(huì)自動(dòng)獲取各應(yīng)用下的urls文件路徑,當(dāng)為include直接傳入字符串值時(shí),會(huì)識(shí)別為導(dǎo)入路徑
# 注意:總路由下url不可以使用'$'限制結(jié)尾
# 在每個(gè)應(yīng)用下新建urls.py
from django.conf.urls import url
from app02 import views # 注意導(dǎo)入本項(xiàng)目views
urlpatterns = [
url(r'^jiliguala/', views.jiliguala, name='app02_jiliguala'),
]
from django.conf.urls import url
from app03 import views # 注意導(dǎo)入本項(xiàng)目views
urlpatterns = [
url(r'^jiliguala/', views.jiliguala, name='app03_jiliguala'),
]
# 實(shí)現(xiàn)各APP內(nèi)路由函數(shù)
from django.shortcuts import render, HttpResponse, redirect
# Create your views here.
def jiliguala(request):
return HttpResponse('app02_jiliguala')
from django.shortcuts import render, HttpResponse, redirect
# Create your views here.
def jiliguala(request):
return HttpResponse('app03_jiliguala')
名稱空間
# 當(dāng)多個(gè)應(yīng)用下的url別名重復(fù)時(shí),反向解析不能自動(dòng)識(shí)別該url的應(yīng)用前綴
# 總路由設(shè)置
urlpatterns = [
url(r'^app02/',include(app02_urls, namespace='app02')),
url(r'^app03/',include(app03_urls, namespace='app03'))
]
# 反向解析
reverse('app02:jiliguala')
<a href="{% url 'app02:jiliguala' %}">jiliguala</a>
# 一般情況下,我們這樣設(shè)置url別名:appname_別名
偽靜態(tài)
# 即將一個(gè)動(dòng)態(tài)網(wǎng)頁偽裝成一個(gè)靜態(tài)網(wǎng)頁
# 目的是增大本網(wǎng)站的SEO查詢力度,增加被搜索引擎收藏的幾率
虛擬環(huán)境
# 在一般開發(fā)中,我們會(huì)給每一個(gè)項(xiàng)目配備一個(gè)該項(xiàng)目獨(dú)有的解釋器環(huán)境,該環(huán)境內(nèi)只有該項(xiàng)目用到的模塊。
# 項(xiàng)目會(huì)配備一個(gè)requirements.txt的文件,里面存有該項(xiàng)目需要的所有的模塊及對(duì)應(yīng)版本