Django 子应用路由注册

一个基本接口定义

子应用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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容