Код: Выделить всё
from django.http import HttpResponseForbidden
class MyCustomMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
return self.get_response(request)
def process_view(self, request, view_func, view_args, view_kwargs):
# Perform some internal actions on the `request` object.
return None
Код: Выделить всё
from functools import wraps
from django.http import HttpResponseForbidden
class MyCustomMiddleware:
...
def process_view(self, request, view_func, view_args, view_kwargs):
if getattr(view_func, "some_condition", False):
return HttpResponseForbidden("Forbidden on custom middleware")
# Perform some internal actions on the `request` object.
return None
def custom_middleware_exempt(view_func):
@wraps(view_func)
def _view_wrapper(request, *args, **kwargs):
return view_func(request, *args, **kwargs)
_view_wrapper.some_condition = True
return _view_wrapper
Код: Выделить всё
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
class MyViewSet(viewsets.ViewSet):
@action(detail=False, methods=['get'])
@custom_middleware_exempt
def my_action(self, request):
return Response()
Внутри декоратора: view_func =
В промежуточном программном обеспечении: view_func =
Очевидно, промежуточное ПО Django применяется на уровне набора представлений, а не на уровне действий. Как следствие, у view_func не установлен атрибут some_condition.
Есть ли способ украсить действие набора представлений и изменить функцию уровня набора представлений или альтернативу способ достичь того, чего я пытаюсь сделать?
Подробнее здесь: https://stackoverflow.com/questions/787 ... of-a-custo