在所有方法之后调用函数 Django Rest Framework ModelViewSet
Invoke function after all methods Django Rest Framework ModelViewSet
我想在 ModelViewSet 中的所有方法之后调用一个函数。该函数本身将用作外部事件日志。因此,不会修改来自视图的响应。我无法弄清楚如何实现这一目标。我的 ModelViewSet 是一个非常基本的模型,其中定义了序列化器 class 和查询集。
如有任何帮助,我们将不胜感激。
您始终可以覆盖任何 python class。覆盖所有方法可能有点棘手,我想只会创建不必要的日志。您应该只覆盖真正重要的方法。这是一个例子:
class LoggingModelViewSet(viewsets.ModelViewSet):
def perform_create(self, serializer):
print('Invoked perform_create')
serializer.save(owner=self.request.user)
def finalize_response(self, request, response, *args, **kwargs):
xresponse = super().finalize_response(request, response, *args, **kwargs)
print('finalize_response', xresponse)
return xresponse
还有更多类似的...您应该在此处查看源代码https://github.com/encode/django-rest-framework/blob/master/rest_framework/viewsets.py#L217它并不那么棘手。
覆盖视图的 dispatch
方法。
class MyDRFView(...):
def my_custom_logging_method(self, request, response, *args, **kwargs):
# do something useful here.....
...
def dispatch(self, request, *args, **kwargs):
response = super().dispatch(request, *args, **kwargs)
self.my_custom_logging_method(request, response, *args, **kwargs)
return respons
我想在 ModelViewSet 中的所有方法之后调用一个函数。该函数本身将用作外部事件日志。因此,不会修改来自视图的响应。我无法弄清楚如何实现这一目标。我的 ModelViewSet 是一个非常基本的模型,其中定义了序列化器 class 和查询集。
如有任何帮助,我们将不胜感激。
您始终可以覆盖任何 python class。覆盖所有方法可能有点棘手,我想只会创建不必要的日志。您应该只覆盖真正重要的方法。这是一个例子:
class LoggingModelViewSet(viewsets.ModelViewSet):
def perform_create(self, serializer):
print('Invoked perform_create')
serializer.save(owner=self.request.user)
def finalize_response(self, request, response, *args, **kwargs):
xresponse = super().finalize_response(request, response, *args, **kwargs)
print('finalize_response', xresponse)
return xresponse
还有更多类似的...您应该在此处查看源代码https://github.com/encode/django-rest-framework/blob/master/rest_framework/viewsets.py#L217它并不那么棘手。
覆盖视图的 dispatch
方法。
class MyDRFView(...):
def my_custom_logging_method(self, request, response, *args, **kwargs):
# do something useful here.....
...
def dispatch(self, request, *args, **kwargs):
response = super().dispatch(request, *args, **kwargs)
self.my_custom_logging_method(request, response, *args, **kwargs)
return respons