通过Django REST Framework框架编程,且存在多个APP应用时,URL该如何设置?这里介绍两种不同的设置方式,一种是同意放到主urls.py文件中;另一种是分别放到各应用的urls.py文件中。
我的项目工程中包含用户中心(userCenter)、产品中心(prodCenter)、和工具集中心(toolsCenter)这样3个APP应用,如下图所示:
直接上代码
# aijoke_drfAPP/aijoke_drfAPP/urls.py
from django.contrib import admin
from django.conf.urls import url, include
from rest_framework import routers
# 注意下面三行,分别是3个APP应用的导入
from userCenter import views
from prodCenter import views as pviews
from toolsCenter import views as tviews
router = routers.DefaultRouter()
# 将三个应用的视图(views)向默认router中注册,这样就可以看到各个应用中心的接口链接了
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)
router.register(r'product', pviews.ProdViewSet)
router.register(r'tools', tviews.FileViewSet)
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include(router.urls)), # 该语句可以显示首页(http://127.0.0.1:8000/)
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), # 页面会增加login/logout登录选项
]
效果如下:
- 优点:
- 方便简单;
- 页面Api Root下能看到所有应用的链接地址;
- 缺点:
- 结构层次不太清晰;
- 修改不注意时容易修改错,导致其它应用路由出现问题;
代码如下:
主urls.py
# aijoke_drfAPP/aijoke_drfAPP/urls.py
from django.contrib import admin
from django.conf.urls import url, include
from rest_framework import routers
from prodCenter import views as pviews # 这里只导入了一个产品中心的工程
router = routers.DefaultRouter() # 定义默认路由
router.register(r'product', pviews.ProdViewSet) # 这里只注册了一个产品中心的路由
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include(router.urls)),
url(r'^tools/', include('toolsCenter.urls')), # 如果地址首先匹配到tools,则引用toolsCenter中的urls文件
url(r'^users/', include('userCenter.urls')), # 如果地址首先匹配到tools,则引用userCenter中的urls文件
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]
toolsCenter下的urls.py
# /aijoke_drfAPP/toolsCenter/urls.py
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
from django.conf.urls import url,include
from toolsCenter import views
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'', views.FileViewSet)
urlpatterns = [
url(r'^', include(router.urls)),
]
userCenter下的urls.py
# /aijoke_drfAPP/userCenter/urls.py
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
from django.conf.urls import url,include
from rest_framework import routers
from userCenter import views
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet) # 注册用户接口
router.register(r'groups', views.GroupViewSet) # 注册分组接口
urlpatterns = [
url(r'^', include(router.urls)),
]
因为我们的用户中心APP中有2个接口,所以我们需要分别注册users和groups,这样才能控制如何进入用户接口,如何进入分组接口
首页效果如下:
因为我们的主urls.py文件中只注册了产品中心,所以这里只能看到产品中心的接口链接地址
那我们想看工具集中心(toolsCenter)的接口怎么办呢,我们需要输入完成的地址(http://127.0.0.1:8000/tools/),工具集中心的接口效果如下:
同样的道理,我们想看用户中心的接口,需要输入完整的地址(http://127.0.0.1:8000/users/)用户中心效果如下:
- 优点:
- 结构层次更清晰;
- 修改代码几乎互相不受影响,不怕修改错导致其它工程无法找到路由;
- 缺点:
- 无法看到所有接口链接地址,需要自己知道完整的路径才能进入到各自应用的接口
其实我个人更喜欢层次清晰一点的第二种方式,但是它的缺点也很明显,如果哪位大神能帮忙解决这个问题,可以直接回复我,本人非常感谢