我做了一个泛型
RequestLogMiddleware,可以使用将它连接到任何Django
View中
decorator_from_middleware。
request_log / middleware.pyimport socketimport timeclass RequestLogMiddleware(object): def process_request(self, request): request.start_time = time.time() def process_response(self, request, response): if response['content-type'] == 'application/json': if getattr(response, 'streaming', False): response_body = '<<<Streaming>>>' else: response_body = response.content else: response_body = '<<<Not JSON>>>' log_data = { 'user': request.user.pk, 'remote_address': request.meta['REMOTE_ADDR'], 'server_hostname': socket.gethostname(), 'request_method': request.method, 'request_path': request.get_full_path(), 'request_body': request.body, 'response_status': response.status_pre, 'response_body': response_body, 'run_time': time.time() - request.start_time, } # save log_data in some way return responserequest_log / mixins.py
from django.utils.decorators import decorator_from_middlewarefrom .middleware import RequestLogMiddlewareclass RequestLogViewMixin(object): """ Adds RequestLogMiddleware to any Django View by overriding as_view. """ @classmethod def as_view(cls, *args, **kwargs): view = super(RequestLogViewMixin, cls).as_view(*args, **kwargs) view = decorator_from_middleware(RequestLogMiddleware)(view) return view
my_django_rest_api / views.py
from rest_framework import genericsfrom ...request_log.mixins import RequestLogViewMixinclass SomeListView( RequestLogViewMixin, generics.ListAPIView): ...



