ninth_视图集_路由

pycharm小技巧,在代码空白处(即非类代码里)右键倒数第二个的选着可以看树形继承图 

 

2. 视图

Django REST framwork 提供的视图的主要作用:

  • 控制序列化器的执行(检验、保存、转换数据)

  • 控制数据库查询的执行

2.1 APIView

rest_framework.views.APIView

APIView是REST framework提供的所有视图的基类,继承自Django的View父类。

APIViewView的不同之处在于:

  • 传入到视图方法中的是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错误

  3)RetrieveModelMixin

  详情视图扩展类,提供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 GenericAPIView的视图子类

  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

  继承自APIViewViewSetMixin,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。

  ViewSet主要通过继承ViewSetMixin来实现在调用as_view()时传入字典(如{'get':'list'})的映射处理工作。

  在ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法。

  2)GenericViewSet

  使用ViewSet通常并不方便,因为list、retrieve、create、update、destory等方法都需要自己编写,而这些方法与前面讲过的Mixin扩展类提供的方法同名,所以我们可以通过继承Mixin扩展类来复用这些方法而无需自己编写。但是Mixin扩展类依赖与GenericAPIView,所以还需要继承GenericAPIView

  GenericViewSet就帮助我们完成了这样的继承工作,继承自GenericAPIViewViewSetMixin,在实现了调用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

  2)DefaultRouter

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

posted @ 2019-05-07 15:48  pythonernoob  阅读(159)  评论(0)    收藏  举报