缓存 Django Rest Framework 基于函数的视图会导致权限类被忽略

问题描述 投票:0回答:1

我遇到一个奇怪的问题,我的基于函数的视图缓存似乎与应用于它的权限类冲突。视图的装饰器如下:

@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
方法装饰器中指定的单个权限类更严格。)

简而言之:一旦视图被缓存,就可以访问它,而无需向其应用任何权限类。

如何解决此问题,以便权限类正确应用于缓存视图?

python django django-rest-framework
1个回答
0
投票

我觉得现在问这个问题有点愚蠢,因为我自己很快就找到了答案。装饰器的顺序似乎很重要。按如下方式重新排序已解决问题:

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

令我惊讶的是,没有应用任何权限类别。显然存在一种既不使用默认权限又不使用覆盖的权限类的场景,这似乎是有问题的。我的印象当然是那永远不会发生。

© www.soinside.com 2019 - 2024. All rights reserved.