ninth_视图集_路由

pycharm小技巧,在代码空白处(即非类代码里)右键倒数第二个的选着可以看树形继承图
2. 视图
Django REST framwork 提供的视图的主要作用:
-
控制序列化器的执行(检验、保存、转换数据)
-
控制数据库查询的执行
2.1 APIView
rest_framework.views.APIView
APIView是REST framework提供的所有视图的基类,继承自Django的View父类。
-
传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象;
-
视图方法可以返回REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的格式;
-
任何APIException异常都会被捕获到,并且处理成合适的响应信息;
-
在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。
2.2 GenericAPIView[通用视图类]
rest_framework.generics.GenericAPIView
继承自APIVIew,主要增加了操作序列化器和数据库查询的方法,作用是为下面Mixin扩展类的执行提供方法支持。通常在使用时,可搭配一个或多个Mixin扩展类。
1)ListModelMixin
列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码。
该Mixin的list方法会对数据进行过滤和分页。
2)CreateModelMixin
创建视图扩展类,提供create(request, *args, **kwargs)方法快速实现创建资源的视图,成功返回201状态码。
如果序列化器对前端发送的数据验证失败,返回400错误
详情视图扩展类,提供retrieve(request, *args, **kwargs)方法,可以快速实现返回一个存在的数据对象。
如果存在,返回200, 否则返回404
4)UpdateModelMixin
更新视图扩展类,提供update(request, *args, **kwargs)方法,可以快速实现更新一个存在的数据对象。
同时也提供partial_update(request, *args, **kwargs)
成功返回200,序列化器校验数据失败时,返回400错误。
5)DestroyModelMixin
删除视图扩展类,提供destroy(request, *args, **kwargs)方法,可以快速实现删除一个存在的数据对象。
成功返回204,不存在返回404。
2.3
1)CreateAPIView
提供 post 方法
继承自: GenericAPIView、CreateModelMixin
2)ListAPIView
提供 get 方法
继承自:GenericAPIView、ListModelMixin
3)RetrieveAPIView
提供 get 方法
继承自: GenericAPIView、RetrieveModelMixin
4)DestoryAPIView
提供 delete 方法
继承自:GenericAPIView、DestoryModelMixin
5)UpdateAPIView
提供 put 和 patch 方法
继承自:GenericAPIView、UpdateModelMixin
6)RetrieveUpdateAPIView
提供 get、put、patch方法
继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin
7)RetrieveUpdateDestoryAPIView
提供 get、put、patch、delete方法
继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin
2.4 常用视图集父类
1) ViewSet
继承自APIView与ViewSetMixin,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。
ViewSet主要通过继承ViewSetMixin来实现在调用as_view()时传入字典(如{'get':'list'})的映射处理工作。
在ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法。
2)GenericViewSet
使用ViewSet通常并不方便,因为list、retrieve、create、update、destory等方法都需要自己编写,而这些方法与前面讲过的Mixin扩展类提供的方法同名,所以我们可以通过继承Mixin扩展类来复用这些方法而无需自己编写。但是Mixin扩展类依赖与GenericAPIView,所以还需要继承GenericAPIView。
GenericViewSet就帮助我们完成了这样的继承工作,继承自GenericAPIView与ViewSetMixin,在实现了调用as_view()时传入字典(如{'get':'list'})的映射处理工作的同时,还提供了GenericAPIView提供的基础方法,可以直接搭配Mixin扩展类使用。
3)ModelViewSet
继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。
4)ReadOnlyModelViewSet
继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin。
3. 视图集中定义附加action动作
"""使用ModelViewSet简写上面的继承代码""" from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet from rest_framework.decorators import action class StudentModelViewSet(ModelViewSet): # 本次视图类中要操作的数据[必填] queryset = Student.objects.all() # 本次视图类中要调用的默认序列化器[选填] serializer_class = StudentModelSerializer def login(self, request, pk): """学生登录功能""" print(self.action) print(pk) return Response({"message": "登录成功"})
# url的定义 urlpatterns = [ path("students8/", views.StudentModelViewSet.as_view({"get": "list", "post": "create"})), re_path("students8/(?P<pk>\d+)/", views.StudentModelViewSet.as_view({"get": "retrieve", "put": "update", "delete": "destroy"})), path("stu/login/",views.StudentModelViewSet.as_view({"get":"login"})) ]
3.1 action 属性,路由Routers
# 视图 """使用ModelViewSet简写上面的继承代码""" from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet from rest_framework.decorators import action class StudentModelViewSet(ModelViewSet): # 本次视图类中要操作的数据[必填] queryset = Student.objects.all() # 本次视图类中要调用的默认序列化器[选填] serializer_class = StudentModelSerializer @action(methods=["get", "put"], detail=True) # methods 设置当前方法允许哪些http请求访问当前视图方法 # detail 设置当前视图方法是否是操作一个数据 def login(self, request, pk): """学生登录功能""" print(self.action) print(pk) return Response({"message": "登录成功"})
# 路由 """使用drf提供路由类router给视图集生成路由列表""" # 实例化路由类 # drf提供一共提供了两个路由类给我们使用,他们用法一致,功能几乎一样 # DefaultRouter # SimpleRouter from rest_framework.routers import DefaultRouter, SimpleRouter # router = DefaultRouter() # 上线用这个,如果网址错误不会把全部子网址显示出来 router = SimpleRouter() # 开发用这个,如果网址错误就会把子网址显示出来,提高开发效率 # 注册视图集 # router.register("路由前缀",视图集类) router.register("router_stu", views.StudentModelViewSet) # 把生成的路由列表追加到urlpatterns print(router.urls) urlpatterns += router.urls
对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息。
REST framework提供了两个router
-
SimpleRouter
-
DefaultRouter
3.2 视图集中附加action的声明
在视图集中,如果想要让Router自动帮助我们为自定义的动作生成路由信息,需要使用rest_framework.decorators.action装饰器。
以action装饰器装饰的方法名会作为action动作名,与list、retrieve等同。
action装饰器可以接收两个参数:
-
methods: 声明该action对应的请求方式,列表传递
-
detail
: 声明该action的路径是否与单一资源对应,及是否是
xxx/<pk>/action方法名/-
True 表示路径格式是xxx/<pk>/action方法名/
-
False 表示路径格式是xxx/action方法名/
-
3.3 路由router 形成URL的方式
1) SimpleRouter

DefaultRouter与SimpleRouter的区别是,DefaultRouter会多附带一个默认的API根视图,返回一个包含所有列表视图的超链接响应数据。


浙公网安备 33010602011771号