Промежуточное ПО Django запускается до получения разрешений drf

У меня есть класс промежуточного ПО, который выглядит примерно так:

class DogMiddleware:
    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):
        dog_id = view_kwargs.get("dog_id")
        if dog_id is not None:
            dog = Dog.objects.get(id=dog_id)
            request.dog = dog

У меня есть представление, которое выглядит примерно так:

class DogDetail(APIView):
    def get(self, request, dog_id, *args, **kwargs):
         return "some nice doggy info"

Мои разрешения по умолчанию IsAuthenticated:

    "DEFAULT_PERMISSION_CLASSES": (
        "rest_framework.permissions.IsAuthenticated",
    ),

Когда я вызываю представление DogDetail из состояния выхода из системы, с несуществующей собакой, я получаю ошибку 500 и исключение DoesNotExist. Из этого я делаю вывод, что промежуточное программное обеспечение запускается до разрешений.

Мои вопросы: Является ли это ожидаемым поведением? Если нет, то что я делаю неправильно?

Если да, то это очень неидеально, потому что будет очень легко утечка данных через промежуточное ПО. В моем примере неаутентифицированному пользователю было бы очень легко определить, какие dog_id существуют. Какой хороший способ смягчить это? Думаю, я мог бы проверять аутентификацию в промежуточном ПО и пропускать неаутентифицированные запросы без получения dog_id? Это похоже на глубокую ошибку в будущем, когда промежуточное ПО работает правильно, но собака не привязывается к запросу.

Заранее спасибо!

Вернуться на верх