python - "CSRF token missing"带有 PUT/DELETE 方法 Rest-framework

标签 python django rest

我正在使用 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 与请求一起放置。您可以通过以下方式克服这个问题:

  1. 要在 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/

    相关文章:

    django 验证多个内联表单

    java - Jersey:处理 Restful HTTP PUT(更新)请求的最佳实践

    .net - 如何在 ASP.NET Web API 中指定我想要 JSON 还是 XML?

    java - Apache Ignite - 如何在以编程方式启动节点时启用 Rest API?

    python - 无法通过 python 记录器打印预期响应

    Python - 使用列表理解查找增量编号序列

    python - 在类中声明装饰器

    python - Pandas - 将值转换为 1 和 0 的快速方法

    python - Django 多态 - 我可以按内容类型指定顺序吗?

    python - 民意调查正在添加多票