为什么我会收到'CSRF令牌丢失或不正确'的错误?

问题描述:

我想从Django的View函数中返回一个值。该函数是使用Ajax从JavsScript代码中调用的,但是我得到的错误是'Forbidden(CSRF token missing or incorrect)'。为什么我会收到'CSRF令牌丢失或不正确'的错误?

JavaScript/Ajax

The Error message

的HTML代码看起来是这样的:

<div align="center" class="input-line"> 
    <form class="input-form" method="post">{% csrf_token %} 
     <input type = "text" id = "ans" class = "form-control" name = "address" placeholder="Type postcode..."><br><br> 
     <button id = "homeBtn" class="btn btn-primary">Find info</button><br><br> 
    </form> 
</div> 

的查看功能是:

def result(request): 
     if(request == 'POST'): 
      param = request.form['my data'] 
      this = runAreaReview(param) #This returns a string 
      return HttpResponse(this) 
+0

我建议读一读[Cross-Site Request Forryry](https://en.wikipedia.org/wiki/Cross-site_request_forgery),特别是保护它的“Cookie-to-Header Token”方法。 – Quietust

方法1

对于使用ajax发送发布请求,您需要设置一个名为HTTP_X_CSRFTOKEN的标头,并将其值设置为存储在浏览器中的名为csrftoken的cookie。 Reference。 所以在你的ajax调用中,你应该这样做。

var csrftoken = Cookies.get('csrftoken'); 
$.ajax(
    ... 
    headers:{"HTTP_X_CSRF_TOKEN":csrftoken} 
); 

也注意到,如果你正在使用的东西,如一些nginx的反向代理服务器,确保乖谬的这个头,以及在Django应用程序。

方法2

可以通过使用注释停用CSRF验证该特定视图。 Reference

from django.views.decorators.csrf import csrf_exempt 

@csrf_exempt 
def result(request): 
    ... 

方法3

下面的方法不是出于安全考虑,

可以alwaws倒胃口的设置,以摆脱它的CSRF中间件,如果你只是建立用于休闲目的而非生产。

+0

感谢您的建议。我使用** csrf_exempt **,它不会再抛出该错误。 但是现在它会抛出一个错误,指出** View函数没有返回一个Object。它返回None而不是** 我在帖子本身中链接了我的视图函数,任何想法为什么会发生这种情况? –

+0

你应该检查'request.method ==“POST”' –

+0

也,我建议使用带调试器的IDE。它可以帮助您查明问题,从而帮助您解决问题。 :) –