Как пометить действие DRF ViewSet как освобожденное от применения специального промежуточного программного обеспечения?Python

Программы на Python
Anonymous
Как пометить действие DRF ViewSet как освобожденное от применения специального промежуточного программного обеспечения?

Сообщение Anonymous »

Я создал собственное промежуточное ПО Django и правильно добавил переменную настроек MIDDLEWARE.

Код: Выделить всё

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
Поскольку это применяется ко всем наборам представлений DRF по умолчанию, я хотел бы исключить некоторые действия, которые не требуют этой проверки. Идея состоит в том, чтобы проверить флаг внутри функцииprocess_view, вдохновленный Django CsrfViewMiddleware, который проверяет, была ли переменная csrf_exempt установлена ​​декоратором csrf_exempt. Поэтому я изменил пользовательское промежуточное программное обеспечение и создал собственный декоратор для явного исключения представлений.

Код: Выделить всё

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
При этом я делаю что-то вроде этого, и он правильно входит в пользовательский декоратор перед входом в промежуточное программное обеспечение Django.

Код: Выделить всё

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 пользовательского промежуточного программного обеспеченияprocess_view соответствует не функции действия (которая декорируется), а функцию ViewSet.
Внутри декоратора: view_func =
В промежуточном программном обеспечении: view_func =
Очевидно, промежуточное ПО Django применяется на уровне набора представлений, а не на уровне действий. Как следствие, у view_func не установлен атрибут some_condition.
Есть ли способ украсить действие набора представлений и изменить функцию уровня набора представлений или альтернативу способ достичь того, чего я пытаюсь сделать?

Подробнее здесь: https://stackoverflow.com/questions/787 ... of-a-custo

Вернуться в «Python»