我正在使用 django Rest Framework 可浏览 api 和 ModelViewSet 来执行 CRUD 操作,并希望使用权限。IsAuthenticatedOrReadOnly,但是当我登录并尝试 DELETE 或 PUT 时,我得到
"detail": "CSRF 失败:CSRF token 丢失或不正确。"
我的观点是这样的
class objViewSet(viewsets.ModelViewSet):
queryset = obj.objects.all()
serializer_class = objSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
设置.py
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.AllowAny',
),
序列化器只是
class ObjSerializer(serializers.ModelSerializer):
class Meta:
model = Obj
尽管当我删除permission_classes(因此默认的allowAny触发器)时,我可以它工作得很好。
我想要什么
仅当我通过身份验证时才能进行 PUT/DELETE。我不知道如何发送 CSRF token ,当一切自动发生时(modalviewset 完成全部工作)
最佳答案
在您的 REST_FRAMEWORK 设置中,您没有提到身份验证方案,因此 DRF 使用默认的身份验证方案,即 SessionAuthentication。此方案强制您将 csrf token 与请求一起放置。您可以通过以下方式克服这个问题:
- 要在 settings.py 中为整个项目进行此设置,请添加
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication',
)}
- 要在特定 View 中进行此设置,请在您的 View 中执行以下操作
class objViewSet(viewsets.ModelViewSet):
queryset = obj.objects.all()
serializer_class = objSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
authentication_classes = (BasicAuthentication,)
来源:http://www.django-rest-framework.org/api-guide/authentication/#sessionauthentication
顺便说一句,csrf token 保存为名为“csrftoken”的 cookie。您可以从 HTTP 响应中检索它,并使用 key “X-CSRFToken”将其附加到您的请求 header 。您可以在以下位置查看一些详细信息:https://docs.djangoproject.com/en/dev/ref/csrf/#ajax
关于python - "CSRF token missing"带有 PUT/DELETE 方法 Rest-framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39243912/