我正在尝试从Django中的View函数返回一个值。该函数是使用Ajax从JavsScript代码调用的,但是我会抛出一个错误,该错误读取“禁止(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)
答案 0 :(得分:2)
方法1
要使用ajax发布帖子请求,您需要设置一个名为HTTP_X_CSRFTOKEN
的标头,并将其设置为一个Cookie,该Cookie会以名称csrftoken
存储在浏览器中。 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
出于安全原因,建议不要使用以下方法
如果您只是为娱乐目的而不是为了制作而构建一些东西,那么您可以在设置中关闭csrf中间件以摆脱它。
答案 1 :(得分:0)
对于遇到此线程的任何人,HEADER键应为X-CSRFToken
,对于Django 2.1,链接应在此处https://docs.djangoproject.com/en/2.1/ref/csrf/