文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【Django】REST_Framework框架——视图集ViewSet和ModelViewSet源码解析

2023-09-12 20:43

关注

在这里插入图片描述


继承APIView和ViewSetMixin;
作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。
ViewSet在开发接口中不经常用

1、ViewSet源码

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

class ViewSet(ViewSetMixin, views.APIView):    """    The base ViewSet class does not provide any actions by default.    """    pass

ViewSet视图集类不再限制视图方法名只允许get()、post()等这种情况了,而是实现允许开发者根据自己的需要定义自定义方法名,例如 list() 、create() 等,然后经过路由中使用http和这些视图方法名进行绑定调用

2、ViewSetMixin源码

ViewSet主要通过继承ViewSetMixin来实现在调用as_view()时传入字典{“http请求”:“视图方法”}的映射处理工作,如
{‘get’:’list’,
‘post’:‘create’,
‘put’:‘update’,
‘delete’:‘destory’},

在这里插入图片描述

@classonlymethod    def as_view(cls, actions=None, **initkwargs):        """        Because of the way class based views create a closure around the        instantiated view, we need to totally reimplement `.as_view`,        and slightly modify the view function that is created and returned.        """        # The name and description initkwargs may be explicitly overridden for        # certain route configurations. eg, names of extra actions.        cls.name = None        cls.description = None        # The suffix initkwarg is reserved for displaying the viewset type.        # This initkwarg should have no effect if the name is provided.        # eg. 'List' or 'Instance'.        cls.suffix = None        # The detail initkwarg is reserved for introspecting the viewset type.        cls.detail = None        # Setting a basename allows a view to reverse its action urls. This        # value is provided by the router through the initkwargs.        cls.basename = None        # actions must not be empty        if not actions:            raise TypeError("The `actions` argument must be provided when ""calling `.as_view()` on a ViewSet. For example ""`.as_view({'get': 'list'})`")        # sanitize keyword arguments        for key in initkwargs:            if key in cls.http_method_names:                raise TypeError("You tried to pass in the %s method name as a "    "keyword argument to %s(). Don't do that."    % (key, cls.__name__))            if not hasattr(cls, key):                raise TypeError("%s() received an invalid keyword %r" % (                    cls.__name__, key))        # name and suffix are mutually exclusive        if 'name' in initkwargs and 'suffix' in initkwargs:            raise TypeError("%s() received both `name` and `suffix`, which are ""mutually exclusive arguments." % (cls.__name__))        def view(request, *args, **kwargs):            self = cls(**initkwargs)            if 'get' in actions and 'head' not in actions:                actions['head'] = actions['get']            # We also store the mapping of request methods to actions,            # so that we can later set the action attribute.            # eg. `self.action = 'list'` on an incoming GET request.            self.action_map = actions            # Bind methods to actions            # This is the bit that's different to a standard view            for method, action in actions.items():                handler = getattr(self, action)                setattr(self, method, handler)            self.request = request            self.args = args            self.kwargs = kwargs            # And continue as usual            return self.dispatch(request, *args, **kwargs)        # take name and docstring from class        update_wrapper(view, cls, updated=())        # and possible attributes set by decorators        # like csrf_exempt from dispatch        update_wrapper(view, cls.dispatch, assigned=())        # We need to set these on the view function, so that breadcrumb        # generation can pick out these bits of information from a        # resolved URL.        view.cls = cls        view.initkwargs = initkwargs        view.actions = actions        return csrf_exempt(view)

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

ModelViewSet继承自 GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。

1、ModelViewSet源码

class ModelViewSet(mixins.CreateModelMixin,                   mixins.RetrieveModelMixin,                   mixins.UpdateModelMixin,                   mixins.DestroyModelMixin,                   mixins.ListModelMixin,                   GenericViewSet):    """    A viewset that provides default `create()`, `retrieve()`, `update()`,    `partial_update()`, `destroy()` and `list()` actions.    """    pass

ReadOnlyModelViewSet承自 GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin。

1、ReadOnlyModelViewSet源码

class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,                           mixins.ListModelMixin,                           GenericViewSet):    """    A viewset that provides default `list()` and `retrieve()` actions.    """    pass

GenericViewSet继承ViewSetMixin、GenericAPIView
继承ViewSetMixin:实现了在调用as_view()时传入字典{“http请求”:“视图方法”}的映射处理工作,如
{‘get’:’list’,
‘post’:‘create’,
‘put’:‘update’,
‘delete’:‘destory’},
继承了GenericAPIView:实现了分页、限流、过滤功能

class GenericViewSet(ViewSetMixin, generics.GenericAPIView):    """    The GenericViewSet class does not provide any actions by default,    but does include the base set of generic view behavior, such as    the `get_object` and `get_queryset` methods.    """    pass

在这里插入图片描述

来源地址:https://blog.csdn.net/YZL40514131/article/details/126598807

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯