DjangoREST_Framework框架——视图集ViewSet和ModelViewSet源码解析
Posted 敲代码敲到头发茂密
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DjangoREST_Framework框架——视图集ViewSet和ModelViewSet源码解析相关的知识,希望对你有一定的参考价值。
一、ViewSet
继承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)
二、ModelViewSet
使用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
ReadOnlyModelViewSet承自 GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin。
1、ReadOnlyModelViewSet源码
class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
mixins.ListModelMixin,
GenericViewSet):
"""
A viewset that provides default `list()` and `retrieve()` actions.
"""
pass
四、GenericViewSet
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
以上是关于DjangoREST_Framework框架——视图集ViewSet和ModelViewSet源码解析的主要内容,如果未能解决你的问题,请参考以下文章
python Django Rest_Framework框架 安装与配置(图文并茂版)
python Django Rest_Framework框架 安装与配置(图文并茂版)
旷视开源深度学习框架天元,为什么说深度学习框架没有捷径可走?