Кэширование представления на основе функций 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...
Однако меня все еще удивляет, что никакие классы разрешений не применяются. Кажется проблематичным, что существует сценарий, в котором не используются ни классы разрешений по умолчанию, ни переопределенные классы разрешений. У меня сложилось впечатление, что этого никогда не произойдет.