python - Django Rest Framework 中 CreateAPIView 的权限

标签 python django permissions django-rest-framework

我查看了 CreateAPIView 的代码,在创建过程中没有检查权限。所以我决定在 perform_create 钩子(Hook)中检查它们,如下所示:

class CourseList(generics.CreateAPIView):
    """
    Create a course.
    A user can create a course if he/she is an instructor in
    the academy the course is to be created in.
    """
    serializer_class = CourseRef
    queryset = Course.objects.all()
    permission_classes = (IsAuthenticated, IsInstructorInAcademy)

    def perform_create(self, serializer):
        self.check_object_permissions(self.request, serializer.validated_data.get('academy'))
        serializer.save()

权限看起来像:

class IsInstructorInAcademy(BasePermission):
    def has_object_permission(self, request, view, academy):
        return request.user.instructor_set.filter(academy=academy).exists()

当我尝试创建类(class)时,初始权限检查运行正常并且类(class)已保存,但之后我立即收到以下错误:

ValueError at /api/courses/
Cannot query "Mathematics 11A": Must be "Academy" instance.

这是在权限检查时引发的,结果是 POST 返回 500 ISE。

(这有点老套,因为我在 perform_create Hook 的权限检查中传入了学院实例,而 View 确实与类(class)有关。我考虑过使用权限 IsInstructorInAcademyOfObject 但为此,我需要传入一个对象,除非保存序列化程序,否则我无法获取该对象。)

在这里检查权限的最佳方法是什么?

最佳答案

您遇到问题是因为您将业务逻辑检查与权限绑定(bind)。

不要调用 check_object_permission,而是在反序列化后执行您自己的检查,如果失败则引发 PermissionDenied

关于python - Django Rest Framework 中 CreateAPIView 的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35787962/

相关文章:

android - Android 中哪些功能或代码需要 GET_TASKS 权限?

python - Pandas Holidays to Dataframe with Holiday Name

python - 使用 spaCy 去除标点符号;属性错误

python - Flask Postgresql 数组不会永久更新

css - 加载后未应用 Django admin css

C# 本地共享的文件/目录权限

python - 如何编写 C++ 代码以使用 SWIG 在 python 提示符中打印变量值

django - 在django中将多对多关系转换为一对多

django - 访问 AppConfig 成员

android facebook sdk - 为openActiveSession设置权限