我遇到一个奇怪的问题,我的基于函数的视图缓存似乎与应用于它的权限类冲突。视图的装饰器如下:
@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...
令我惊讶的是,没有应用任何权限类别。显然存在一种既不使用默认权限又不使用覆盖的权限类的场景,这似乎是有问题的。我的印象当然是那永远不会发生。