drf06 路由组件
drf06 路由组件
路由Routers
路由的书写方法一
# 视图层
from rest_framework.viewsets import ViewSetMixin,ViewSet
'''同时继承两个类太不方便了,'''
# class LoginView(ViewSet): 继承ViewSet和继承下面的是一个效果
class LoginView(ViewSetMixin, APIView): # ViewSetMixin只是重写了as_view,但是没有继承View,所以还有继承APIView才是视图基类
def login(self,request):
return Response('登录成功')
# 路由层
from app01 import views
urlpatterns = [
path('login/', views.LoginView.as_view({'post': 'login'})), # 请求去视图函数里面,是哪个请求执行对应方法
''' ({'post': 'login'})就是路由的第一种写法 '''
路由的书写方法二:自动生成路由
使用方法
对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息。
# REST framework提供了两个router:
from rest_framework.routers import SimpleRouter,DefaultRouter
SimpleRouter
DefaultRouter # 会比SimpleRouter多生成一个根路由
"publish": "http://127.0.0.1:8000/publish/"
SimpleRouter方式一:前提必须继承ViewSet
视图层views.py
# 自动生成路由
from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet, ViewSet, ViewSetMixin, GenericViewSet
# 继承这个5个接口都有了,但是5个接口有两个get
class PublishViews(ModelViewSet):
queryset = Publish.objects.all()
serializer_class = PublishModelSerializer
路由层urls.py
from app01 import views
# 第一步在路由层导入路由类
from rest_framework.routers import SimpleRouter,DefaultRouter
# 第二步:类实例化得到对象(不用传参数)
router = SimpleRouter()
# 第三步:注册视图类
router.register('publish', views.PublishViews, 'publish') # 第三个参数:反向解析
# 第四步:加入到总路由中(两种方式)
print(router.urls) # [, [^/.]+)/$' [name='publish-detail']>]
urlpatterns = [
]
# 第四步:加入到总路由中:方式一
urlpatterns += router.urls
SimpleRouter方式二:前提必须继承ViewSet
from django.urls import path, include
from app01 import views
# 第一步在路由层导入路由类
from rest_framework.routers import SimpleRouter,DefaultRouter
# 第二步:类实例化得到对象(不用传参数)
router = SimpleRouter()
# 第三步:注册视图类
router.register('publish', views.PublishViews, 'publish') # 第三个参数:反向解析
# 第四步:加入到总路由中(两种方式)
print(router.urls) # [, [^/.]+)/$' [name='publish-detail']>]
urlpatterns = [
# 第四步:加入到总路由中:方式二
path('api/vi/', include(router.urls))
]
DefaultRoute使用方式:前提必须继承ViewSet
from django.urls import path, include
from app01 import views
# 第一步在路由层导入路由类
from rest_framework.routers import SimpleRouter,DefaultRouter
# 第二步:类实例化得到对象(不用传参数)
router = DefaultRouter()
# 第三步:注册视图类
router.register('publish', views.PublishViews, 'publish') # 第三个参数:反向解析
# 第四步:加入到总路由中(两种方式)
print(router.urls) # [, [^/.]+)/$' [name='publish-detail']>]
urlpatterns = [
# 第四步:加入到总路由中:方式二
path('api/vi/', include(router.urls))
]
'''会生成一个根路由'''

自动生成路由之指定请求方式
视图层
from rest_framework.decorators import action
from rest_framework.viewsets import ViewSet
class LoginView(ViewSet):
# url_path = '路径名,默认是函数名', url_name = '反向解析'
@action(methods=['GET'], detail=False)
def login(self, request): # 自己写的方法,需要加装饰器
print(request.data)
return Response('登录成功')
路由层
from django.urls import path, include
from app01 import views
# 第一步在路由层导入路由类
from rest_framework.routers import SimpleRouter, DefaultRouter
# 第二步:类实例化得到对象(不用传参数)
router = SimpleRouter()
# 第三步:注册视图类
router.register('user', views.LoginView, 'user')
# 第四步:加入到总路由中(两种方式)
urlpatterns = [
# 方式二:
path('', include(router.urls))
]
总结
1.第一种:
path('publish/', views.PublishView.as_view(actions={'get': 'list','post':'create'}))
2.第二种:
自动生成 (SimpleRouter,DefaultRouter)
3.action有什么用?
5个方法:create,list,destory。。,不需要使用action映射
如果继承的是 ViewSetMixin, views.APIView +5个视图扩展类之一或者9个视图子类,这种不需要使用action装饰器
# 因为上述这些,已经都做好了,自己写的方法都需要加action装饰器