Django restframework:ReadOnlyModelViewSet创建HTTP_403但需要HTTP_405

时间:2018-06-25 09:44:05

标签: python django django-rest-framework

我正在使用django和django rest框架创建REST-API,因此我正在使用ReadOnlyModelViewSet。在测试create / POST方法的单元测试中,我期望HTTP_405_METHOD_NOT_ALLOWED,但实际上是HTTP_403_FORBIDDEN。对于update / PUT,它是HTTP_405,符合预期。这是默认行为还是我有一个愚蠢的错误?

是的,用户已通过身份验证。

视图集:

class StudentSolutionReadOnlyModelViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = StudentSolution.objects.all()
    serializer_class = StudentSolutionSerializer

    def get_permissions(self):
        if self.request.method == 'POST':
            return (permissions.IsAuthenticated(), )
        return (permissions.IsAuthenticated(), IsStudentSolutionOwnerOrAdmin(),)

    def get_queryset(self):
        if self.request.user.is_staff:
            return StudentSolution.objects.all(
                course_assignment=self.kwargs['course_assignment_pk']
                ).order_by('student__last_name', 'course_assignment__due_date')
        return StudentSolution.objects.filter(
            student=self.request.user,
            course_assignment=self.kwargs['course_assignment_pk']
            ).order_by('course_assignment__due_date')

编辑1:

class StudentSolutionReadOnlyModelViewSetTests(TestCase):
    def setup(self): 
        #[..]

    def test_create_user_not_allowed(self):
        data = {
            'course_assignment': self.course_assignment.id,
            'student': self.user.id
        }

        url = self.generate_url(self.course_assignment.id)

        self.csrf_client.credentials(HTTP_AUTHORIZATION='JWT ' + self.user_token)
        resp = self.csrf_client.post(
            self.url,
            data=json.dumps(data),
            content_type='application/json'
        )
        self.assertEqual(resp.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)

我对所有方法和generate_url方法都使用相同的身份验证和csrf内容。

0 个答案:

没有答案