柚子快報(bào)激活碼778899分享:后端 Django框架——路由
柚子快報(bào)激活碼778899分享:后端 Django框架——路由
上篇文章我們學(xué)習(xí)了Django框架——請(qǐng)求與響應(yīng),這篇文章我們學(xué)習(xí)Django框架——路由。本次學(xué)習(xí)過程中使用的項(xiàng)目目錄如下圖所示:
大家放心,這個(gè)是新建的Django項(xiàng)目,還沒編寫任何代碼,這里展示目錄是為了大家更好地理解本次學(xué)習(xí)的內(nèi)容。
注意:該項(xiàng)目不是自己手動(dòng)新建文件來創(chuàng)建的,大家可以參考這篇文章來創(chuàng)建——第一個(gè)Django程序。
路由
相信大家對(duì)路由都不陌生,我們?nèi)粘g覽的網(wǎng)頁、網(wǎng)頁中顯示的內(nèi)容都是通過路由技術(shù)使用URL鏈接來獲取的。在Django框架中主要通過視圖函數(shù)views.py與路由urls.py進(jìn)行搭配,從而完成URL路由綁定。
首先在views.py文件中編寫視圖函數(shù),該函數(shù)代碼如下:
from?django.http?import?HttpResponse
def?Welcome(request):
????return?HttpResponse("歡迎學(xué)習(xí)Djang框架之路由")
該視圖函數(shù)名為Welcome,返回的內(nèi)容為字符串:歡迎學(xué)習(xí)Djang框架之路由。編寫視圖函數(shù)后,在urls.py文件中通過path方法使用該路由文件,path語法格式如下:
path('路由地址/',視圖函數(shù),name='別名')??#?別名是可有可無
path('路由地址/<數(shù)據(jù)類型:數(shù)據(jù)名>/',視圖函數(shù),name='別名')??#?傳參寫法
示例代碼如下:
from?django.contrib?import?admin
from?django.urls?import?path
from?App.views?import?*???#?導(dǎo)入視圖函數(shù)
urlpatterns?=?[
????path('admin/',?admin.site.urls),
????path('welcome/',Welcome)??#?URL綁定視圖函數(shù)
]
在urls.py中通過path方法使url路徑與視圖函數(shù)進(jìn)行綁定,接下來我們通過如下代碼啟動(dòng)Django程序,
python?manage.py?runserver
啟動(dòng)后訪問http://127.0.0.1:8000/welcome/即可獲取到視圖函數(shù)返回的內(nèi)容,好了,最基礎(chǔ)的URL路由綁定就是這樣。
除了通過path綁定視圖函數(shù)和url,還可以通過正則匹配re_path綁定,示例代碼如下:
re_path(r'Repath/(?P\d+)/(?P\d+)/',Welcome,name='Welcome')
re_path綁定已經(jīng)很少使用了,這里簡(jiǎn)單知道有re_path綁定即可。
路由分發(fā)
在實(shí)際的開發(fā)過程中,一個(gè)完成的項(xiàng)目肯定會(huì)包含很多app,假如我們將所有app的url路由綁定都寫在主路由Django.urls.py文件中,會(huì)顯得雜亂無章、可維護(hù)性、可讀性差,如下圖所示:
這時(shí)我們可以在每個(gè)app里面創(chuàng)建各自的urls.py路由文件,每個(gè)urls.py綁定各自的視圖函數(shù),如下圖所示:
從主路由出發(fā),將app所屬的URL請(qǐng)求轉(zhuǎn)發(fā)到相應(yīng)的urls.py模塊中,這與Flask框架中的藍(lán)圖類似,在Django框架中叫做路由分發(fā)。
首先在App文件夾中創(chuàng)建urls.py文件,該文件內(nèi)容如下:
from?django.urls?import?path
from?App.views?import?*
urlpatterns?=?[
????path('welcome/',Welcome)
]
注意:urls.py的路由配置必須是urlpatterns,不能隨意更改!
接下來在Django文件夾中的urls.py文件通過include方法中調(diào)用App中的urls.py文件,include語法格式如下:
path('路由地址/',include('子路由'))
path('路由地址/',include(('子路由','App名字'),namespace='命名空間名'))??#?命名空間名可以是任意的
示例代碼如下:
from?django.contrib?import?admin
from?django.urls?import?path,?include
from?App.views?import?*
urlpatterns?=?[
????path('App/',include('App.urls')),??#?使用App中的urls路由
????#?path('App/',include(('App.urls','App'),namespace='Apps'))??#命名空間寫法:使用App中的urls路由
????path('admin/',?admin.site.urls),
]
這里我們根路由的文件夾為App,所以在include中的參數(shù)為App.urls,App名字為App。接下來我們只要訪問http://127.0.0.1:8000/App/welcome/即可獲取到子路由視圖函數(shù)返回的內(nèi)容。
路由傳參
在上面的示例中,URL沒有傳遞參數(shù),當(dāng)我們?cè)L問需要傳遞參數(shù)的URL時(shí),需要在視圖函數(shù)和url.py文件中修改代碼,視圖函數(shù)示例代碼如下:
def?getCan(request,a,b):
????return?HttpResponse(f'姓名:{a}?年齡:')
在App文件夾中urls.py添加如下代碼:
path('GetCan/
當(dāng)我們?cè)L問http://127.0.0.1:8000/App/GetCan/張三/33/,即可返回內(nèi)容為:姓名:張三 年齡:33的頁面。
這樣就成功傳遞了參數(shù),傳遞的參數(shù)類型主要有int和str。
注意:在視圖函數(shù)中參數(shù)位置和訪問的URL傳遞的參數(shù)無關(guān),例如:將上面的視圖函數(shù)改為:
def?getCan(request,b,a):
????return?HttpResponse(f'姓名:{a}?年齡:')
訪問http://127.0.0.1:8000/App/GetCan/張三/33/,返回的內(nèi)容還是姓名:張三 年齡:33
反向解析
當(dāng)我們?cè)L問http://127.0.0.1:8000/App/welcome/時(shí),在正常的解析過程:先在Django的urls.py文件中找到App/路徑,在App/路徑獲取到子路由位置,根據(jù)子路由找到welcome路徑,并找到該路徑綁定的視圖函數(shù),從而獲取視圖函數(shù)的響應(yīng),如下圖所示:
反向解析是通過別名直接在子路由中獲取到視圖函數(shù),如圖下所示:
首先在templates文件夾中添加index.html,該文件代碼如下:
????
????
????正常進(jìn)入
????
????反向解析進(jìn)入
在views.py文件中添加如下代碼:
def?index(request):
????return?render(request,'index.html')
def?getFan(request):
????return?HttpResponse('反向解析')
再在App文件夾中urls.py添加如下代碼:
path('index/',index),
path('Fan/',?getFan,name='FanXiang')
當(dāng)我們?cè)L問http://127.0.0.1:8000/App/index/,不管點(diǎn)擊哪個(gè)鏈接,都可以進(jìn)入http://127.0.0.1:8000/App/Fan/。
反向解析可以在我們修改url時(shí),避免代碼中的硬編碼依賴,同時(shí)提高可讀性和可維護(hù)性。
命名空間
在實(shí)際開發(fā)中,Django中可能存在多個(gè)應(yīng)用程序App,每個(gè)應(yīng)用程序都可能有自己的路由模塊,為了防止路由沖突,Django提供了命名空間(namespace)的概念,命名空間是一種將路由命名為層次結(jié)構(gòu)的方式,使得在查詢路由時(shí),可以限定在該命名空間內(nèi)。
在Django文件夾urls.py文件中,將path('App/',include('App.urls')),代碼修改為:
????path('App/',include(('App.urls','App')),namespace='Apps'),
修改后,上面反向解析示例中的index.html文件的{% url 'FanXiang'%}修改為:
{%??url?'Apps:FanXiang'%}
注意:當(dāng)我們使用了命名空間,所有用到別名的地方,命名空間名。
重定向
重定向(Redirect)就是通過各種方法將各種網(wǎng)絡(luò)請(qǐng)求重新定個(gè)方向轉(zhuǎn)到其它位置(如:網(wǎng)頁重定向、域名的重定向、路由選擇的變化也是對(duì)數(shù)據(jù)報(bào)文經(jīng)由路徑的一種重定向),在Django中,重定向主要使用了redirect和reverse方法,其語法格式如下:
redirect('URL路徑')??
redirect(reverse('別名'))
redirect(reverse('別名',args=[參數(shù),]))??#?固定位置傳參
redirect(reverse('別名',kwargs={"參數(shù)鍵":'參數(shù)值'}))?#?指定參數(shù)傳參
視圖函數(shù)views.py添加如下代碼:
from?django.shortcuts?import?redirect,reverse
def?getRedirect(request):
????#?return?redirect('/App/index/')
????#?return?redirect(reverse('Apps:FanXiang'))
????#?return?redirect(reverse('Apps:getCan',args=['張三',33]))
????return?redirect(reverse('Apps:getCan',kwargs={'a':'張三','b':33}))
App文件夾urls.py文件示例代碼如下:
from?django.urls?import?path
from?App.views?import?*
urlpatterns?=?[
????path('welcome/',Welcome),
????path('GetCan/
????path('index/',index),
????path('Fan/',?getFan,name='FanXiang'),
????path('redirect/',?getRedirect,?name='redirect')
]
接下來大家訪問http://127.0.0.1:8000/App/redirect/即可重定向。
好了,Django框架——路由就學(xué)習(xí)到這里,下篇文章我們學(xué)習(xí)Django框架——模版。
公眾號(hào):白巧克力LIN
該公眾號(hào)發(fā)布Python、數(shù)據(jù)庫、Linux、Flask、Django、自動(dòng)化測(cè)試、Git、算法、前端、服務(wù)器等相關(guān)文章!
- END -
柚子快報(bào)激活碼778899分享:后端 Django框架——路由
文章鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。