为什么我会收到'CSRF令牌丢失或不正确'的错误?
我想从Django的View函数中返回一个值。该函数是使用Ajax从JavsScript代码中调用的,但是我得到的错误是'Forbidden(CSRF token missing or incorrect)'。为什么我会收到'CSRF令牌丢失或不正确'的错误?
的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)
方法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中间件,如果你只是建立用于休闲目的而非生产。
感谢您的建议。我使用** csrf_exempt **,它不会再抛出该错误。 但是现在它会抛出一个错误,指出** View函数没有返回一个Object。它返回None而不是** 我在帖子本身中链接了我的视图函数,任何想法为什么会发生这种情况? –
你应该检查'request.method ==“POST”' –
也,我建议使用带调试器的IDE。它可以帮助您查明问题,从而帮助您解决问题。 :) –
我建议读一读[Cross-Site Request Forryry](https://en.wikipedia.org/wiki/Cross-site_request_forgery),特别是保护它的“Cookie-to-Header Token”方法。 – Quietust