为什么我的CSRF令牌丢失或不正确?#39;错误?

时间:2017-04-06 12:54:09

标签: javascript ajax django python-3.x

我正在尝试从Django中的View函数返回一个值。该函数是使用Ajax从JavsScript代码调用的,但是我会抛出一个错误,该错误读取“禁止(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)

2 个答案:

答案 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/