Кэширование представления на основе функций Django Rest Framework приводит к игнорированию классов разрешений

У меня возникла странная проблема, когда кэширование представления на основе функций, похоже, конфликтует с классами разрешений, применяемыми к нему. Декораторы для представления выглядят следующим образом:

@cache_page(3600)
@api_view(['GET'])
@permission_classes((APIKeyPermission,))
def function_based_view(request): 
    # function-based view code here...

Проблема заключается в следующем: Когда я пытаюсь получить доступ к представлению через HTTP GET, если оно еще не закешировано, оно потребует, чтобы APIKeyPermission было удовлетворено, и выдаст ошибку 401. Это правильное поведение. После успешного кэширования представления любой HTTP GET-запрос может успешно получить к нему доступ без предоставления необходимых разрешений. Важно отметить, что после кэширования представления декоратор @permission_classes, похоже, не делает ничего и представление даже не возвращается к DEFAULT_PERMISSION_CLASSES, как указано в settings.py (которые в данном случае даже более строгие, чем класс единственного разрешения, указанный в декораторе метода @permission_classes)

Короче говоря: как только представление кэшируется, к нему можно обращаться без любого класса разрешения, применяемого к нему.

Как исправить ситуацию, чтобы классы разрешений правильно применялись к кэшированным представлениям?

Я чувствую себя немного глупо из-за того, что задал этот вопрос сейчас, потому что я смог найти ответ самостоятельно довольно быстро. Похоже, что порядок декораторов имеет значение. Переупорядочив их следующим образом, я решил проблему:

@api_view(['GET'])
@permission_classes((APIKeyPermission,))
@cache_page(3600)
def function_based_view(request): 
    # function-based view code here...

Однако меня все еще удивляет, что никакие классы разрешений не применяются. Кажется проблематичным, что существует сценарий, в котором не используются ни классы разрешений по умолчанию, ни переопределенные классы разрешений. У меня сложилось впечатление, что этого никогда не произойдет.

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