在 Django REST 框架中,默认权限类如何与每视图(集)权限类相结合



我正在阅读 http://www.django-rest-framework.org/api-guide/permissions/并试图将其与OAuth2工具包文档相关联,http://django-oauth-toolkit.readthedocs.io/en/latest/rest-framework/getting_started.html。后者有一个例子,其中settings.py指定

REST_FRAMEWORK = {
    # ...
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    )
}

此外,还指定IsAuthenticated添加到ModelViewSetpermission_classes列表中:

class UserViewSet(viewsets.ModelViewSet):
    permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
    queryset = User.objects.all()
    serializer_class = UserSerializer

我是否从这个例子中正确地推断出DEFAULT_PERMISSION_CLASSES没有预置/推迟到ModelViewSet的权限类,而是被它替换?

在 Django REST 框架中,默认权限类如何与每视图(集(权限类相结合?

它们没有组合在一起。

。DEFAULT_PERMISSION_CLASSES不是在模型视图集的权限类前面/之后,而是被它替换?

正确。

我是否从这个例子中正确地推断出 DEFAULT_PERMISSION_CLASSES未预置/推迟到 ModelViewSet的权限类,但被它取代了?

DEFAULT_PERMISSION_CLASSES用于未定义permission_classes的视图/视图集。在定义它们的情况下,将改用它们,而不是默认的。

如果您确实想扩展默认权限,这似乎有效。

免责声明:我是通过查看DRF的代码找到的,不确定它是否被记录在案。

from rest_framework.settings import api_settings
class UserViewSet(viewsets.ModelViewSet):
    permission_classes = [*api_settings.DEFAULT_PERMISSION_CLASSES, TokenHasReadWriteScope]

在自定义权限类中添加代码,如下所示

class ObjectWritePermission(BasePermission):
    # you will see this function in IsAuthenticated Permission class
    def has_permission(self, request, view):
        return bool(request.user and request.user.is_authenticated)
    def has_object_permission(self, request, view, obj):
        return obj.user == request.user

最新更新