Django Rest Framework,CSRF没有在邮递员的POST请求中工作

时间:2017-06-07 08:15:23

标签: django django-rest-framework postman

我的应用使用django rest_framework和SessionAuthentication。我可以成功登录并在cookie中设置会话ID和csrf令牌。但是,POST请求仍然抱怨CSRF失败。

  1. 使用rest_framework登录BasicAuthentication;会话ID和csrf令牌设置为cookie
  2. 将csrf令牌值复制并粘贴到Post请求标头,其中包含密钥“X-CSRFTOKEN”和Cookie中的值。
  3. django.middleware.csrf.CsrfViewMiddleware位于settings.py中的中间件类
  4. 我和Postman一起测试并得到了

    {“detail”:“CSRF失败:CSRF令牌丢失或不正确。”}

    class ApiLoginView(APIView):
    
      authentication_classes = (BasicAuthentication, )
      permission_classes = (IsAuthenticated,)
    
      def post(self, request, *args, **kwargs):
        # use django.contrib.auth.login
        login(request, request.user)
        user = request.user
        return Response("login success")
    
    class ApiUserView(APIView):
    
      authentication_classes = (SessionAuthentication,)
      permission_classes = (IsAuthenticated,)
    
      def post(self, request):
        return Response("ApiUser Post Success")
    
    1. Postman是一个正确的测试工具吗? this seems to be a similar problem in Postman

    2. 我遗失的任何东西?我有什么选择来测试django_rest_framework。

    3. 对不起,这似乎是一个常见的问题,但在阅读相关帖子后我找不到工作。

1 个答案:

答案 0 :(得分:0)

您确实可以使用Postman通过会话身份验证来测试Django Rest Framework。看来,OP勾选了所有框。但是,作为检查清单,我提供了这套对我有用的步骤。

使用DRF,Postman和django会话身份验证时,您需要按以下方式配置邮递员客户端: 1)按以下方式在Postman中设置标头(在本例中为PATCH,但很容易成为POST): enter image description here

2)再次在Postman中将Body设置为raw并插入要发送的JSON数据,如下所示:在这里,我正在更改客户端的电话号码。

{
          "telefone": "42-42424242"

}

3)设置一个名为csrftoken的cookie和一个名为sessionid的cookie enter image description here

csrf cookie的值应与步骤1中的X-CSRFToken标头相同,即 enter image description here

有了这三个要素,并且正确配置了DRF,您应该就可以了。在DRF的设置中,检查是否包含SessionAuthentication:

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.SessionAuthentication',
),....