Python Django restframework:ReadOnlyModelViewSet创建HTTP_403,但应为HTTP_405
我正在使用django和django REST框架创建一个REST-API,因此我使用的是Python Django restframework:ReadOnlyModelViewSet创建HTTP_403,但应为HTTP_405,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在使用django和django REST框架创建一个REST-API,因此我使用的是ReadOnlyModelViewSet。在我测试create/POST方法的单元测试中,我希望HTTP\u 405\u method\u不被允许,但实际上它是HTTP\u 403\u禁止的。对于update/PUT,它是HTTP_405。这是默认行为还是我有一个愚蠢的bug 是的,用户已通过身份验证 视图集: class StudentSolutionReadOnlyModelViewSet(viewse
ReadOnlyModelViewSet
。在我测试create/POST
方法的单元测试中,我希望HTTP\u 405\u method\u不被允许
,但实际上它是HTTP\u 403\u禁止的
。对于update/PUT
,它是HTTP_405
。这是默认行为还是我有一个愚蠢的bug
是的,用户已通过身份验证
视图集:
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)
我对所有方法使用相同的身份验证和csrf内容,以及
generate\u url
方法。您发送的POST
请求是否经过身份验证?是的,它经过身份验证确定,这很奇怪,尝试调试,看看您是否首先进入了条件块self.request.method='POST'
。是的,我正在进入街区。我还将每个案例的权限更改为permissions.AllowAny()
,并且仍然是相同的行为操作。。在您的测试中,url
的值是多少?