urls = MyViewSet.as_view({'get': 'list', 'post': 'create'})
class ViewSetMixin:
@classonlymethod
def as_view(cls, actions=None, **initkwargs):
def view(request, *args, **kwargs):
self = cls(**initkwargs)
if 'get' in actions and 'head' not in actions:
actions['head'] = actions['get']
self.action_map = actions # self.action_map -> {"get':"list"}
for method, action in actions.items(): # 遍历url里面的action字典get,list
handler = getattr(self, action) # getattr(obj,attr)获取对象的属性值 -> handler="list or create.."
setattr(self, method, handler)# setattr(object,get,list) ->
self.request = request
self.args = args
self.kwargs = kwargs
# And continue as usual
return self.dispatch(request, *args, **kwargs) # 调用APIVIEWdispatch
return view
# 复写了APIVIEW里面的initialize_request
def initialize_request(self, request, *args, **kwargs):
"""
Set the `.action` attribute on the view, depending on the request method.
"""
request = super().initialize_request(request, *args, **kwargs) #调用APIVIEW里面的initialize_request
method = request.method.lower()
if method == 'options':
self.action = 'metadata'
else:
# self.action_map -> {"get':"list"}
# 追加了action这个字段 -> self.action= "list"
self.action = self.action_map.get(method)
return request
ViewSetMixin 做了些什么?
于 2023-10-19 14:18:55 首次发布