一个基本接口定义
子应用views.py中定义完函数后,需要在子应用和项目目录中的urls.py分别定义该应用方法函数的路由
先在子应用中创建urls.py,然后固定写法定义方法函数和接口url的映射关系
//子应用目录中urls.py
urlpatterns = [
path('test/', hello),
]
//项目目录中urls.py
urlpatterns = [
path('std01/', include('std01.urls')),
]
子应用urls.py定义最基本功能模块的url,项目中urls.py定义路由分发到哪个子应用
完整接口url就是127.0.0.1:8000/std01/test/
接口带path参数
一种url可以把url路径中某个字段当成参数
子应用urls.py中定义可以如下:
//子应用目录中urls.py
urlpatterns = [
path('test/<name>', getpath),
path('test/<int:name>', getpath), //指定数据类型传参
]
//子应用目录中views.py
def getpath(request,name):
return HttpResponse(f"Hello, {name}")
路由反转和命名空间
子应用中路由定义,可以定义name属性来解决相同URL冲突,也能通过name来反转url减少路由修改带来的影响
reverse反转
e.g:
这里假设一个场景,某子应用1定义了一条路由,定义name为a;子应用2访问该路由
//子应用目录中urls.py
urlpatterns = [
path('test/<name>', getpath,name='a'),
]
如果在某个子应用2中访问了该路由url
url = 'test/xxx'
request.get(url)
那么当子应用1路由修改为
//子应用目录中urls.py
urlpatterns = [
path('testa/<name>', getpath,name='a'),
]
那么子应用2访问该url的地方也得修改,效率就很低,这时候使用name来反转获得url,效率就能提高
from django.urls import reverse
url = reverse('a') //a为目标路由的name属性
request.get(url)
那么无论子应用1中路由怎么修改,子应用2中reverse都能得到正确的url
namespace 命名空间
namespace则是在一个新维度里解决url冲突的场景,namespace由主路由管理urls.py分发定义
e.g:
这里再假设一个场景
子应用1定义路由,name=a;子应用2也定义了路由,name=a
子应用2中使用reverse反转获得子应用1的url时,reverse(name)只会获得自己的url
//子应用1和子应用2 目录中urls.py
urlpatterns = [
path('test/<name>', getpath,name='a'),
]
//在项目路由中分发管理,include可以正确分发到对应应用中
urlpatterns = [
path('', include('app1.urls')),
path('', include('app2.urls')),
]
//问题在子应用2使用reverse(name)想要获得子应用1的url时,无法获取正确url
def getpath(request):
return HttpResponse(f"Hello, {reverse('app')}")
正确区分,需要在子应用url.py中定义app_name属性
//子应用1的urls.py中定义app_name
app_name ='app1'
//项目路由中分发路由时,使用namespace=app_name定义
path('', include('app1.urls', namespace='app1')),
//子应用2在reverse时,加上namespace指定
def getpath(request):
return HttpResponse(f"Hello, {reverse('app1:app')}") //这样得到的url就不会是子应用2自己的,而是子应用1的url