一個基本接口定義
子應(yīng)用views.py中定義完函數(shù)后,需要在子應(yīng)用和項目目錄中的urls.py分別定義該應(yīng)用方法函數(shù)的路由
先在子應(yīng)用中創(chuàng)建urls.py改抡,然后固定寫法定義方法函數(shù)和接口url的映射關(guān)系
//子應(yīng)用目錄中urls.py
urlpatterns = [
path('test/', hello),
]
//項目目錄中urls.py
urlpatterns = [
path('std01/', include('std01.urls')),
]
子應(yīng)用urls.py定義最基本功能模塊的url,項目中urls.py定義路由分發(fā)到哪個子應(yīng)用
完整接口url就是127.0.0.1:8000/std01/test/
接口帶path參數(shù)
一種url可以把url路徑中某個字段當成參數(shù)
子應(yīng)用urls.py中定義可以如下:
//子應(yīng)用目錄中urls.py
urlpatterns = [
path('test/<name>', getpath),
path('test/<int:name>', getpath), //指定數(shù)據(jù)類型傳參
]
//子應(yīng)用目錄中views.py
def getpath(request,name):
return HttpResponse(f"Hello, {name}")
路由反轉(zhuǎn)和命名空間
子應(yīng)用中路由定義释移,可以定義name屬性來解決相同URL沖突痕囱,也能通過name來反轉(zhuǎn)url減少路由修改帶來的影響
reverse反轉(zhuǎn)
e.g:
這里假設(shè)一個場景聂喇,某子應(yīng)用1定義了一條路由,定義name為a儒洛;子應(yīng)用2訪問該路由
//子應(yīng)用目錄中urls.py
urlpatterns = [
path('test/<name>', getpath,name='a'),
]
如果在某個子應(yīng)用2中訪問了該路由url
url = 'test/xxx'
request.get(url)
那么當子應(yīng)用1路由修改為
//子應(yīng)用目錄中urls.py
urlpatterns = [
path('testa/<name>', getpath,name='a'),
]
那么子應(yīng)用2訪問該url的地方也得修改精耐,效率就很低,這時候使用name來反轉(zhuǎn)獲得url琅锻,效率就能提高
from django.urls import reverse
url = reverse('a') //a為目標路由的name屬性
request.get(url)
那么無論子應(yīng)用1中路由怎么修改卦停,子應(yīng)用2中reverse都能得到正確的url
namespace 命名空間
namespace則是在一個新維度里解決url沖突的場景,namespace由主路由管理urls.py分發(fā)定義
e.g:
這里再假設(shè)一個場景
子應(yīng)用1定義路由恼蓬,name=a惊完;子應(yīng)用2也定義了路由,name=a
子應(yīng)用2中使用reverse反轉(zhuǎn)獲得子應(yīng)用1的url時处硬,reverse(name)只會獲得自己的url
//子應(yīng)用1和子應(yīng)用2 目錄中urls.py
urlpatterns = [
path('test/<name>', getpath,name='a'),
]
//在項目路由中分發(fā)管理小槐,include可以正確分發(fā)到對應(yīng)應(yīng)用中
urlpatterns = [
path('', include('app1.urls')),
path('', include('app2.urls')),
]
//問題在子應(yīng)用2使用reverse(name)想要獲得子應(yīng)用1的url時,無法獲取正確url
def getpath(request):
return HttpResponse(f"Hello, {reverse('app')}")
正確區(qū)分荷辕,需要在子應(yīng)用url.py中定義app_name屬性
//子應(yīng)用1的urls.py中定義app_name
app_name ='app1'
//項目路由中分發(fā)路由時凿跳,使用namespace=app_name定義
path('', include('app1.urls', namespace='app1')),
//子應(yīng)用2在reverse時件豌,加上namespace指定
def getpath(request):
return HttpResponse(f"Hello, {reverse('app1:app')}") //這樣得到的url就不會是子應(yīng)用2自己的,而是子應(yīng)用1的url