【问题标题】:Why do I get a 'CSRF token missing or incorrect' error?为什么我会收到“CSRF 令牌丢失或不正确”错误?
【发布时间】:2017-09-01 12:31:25
【问题描述】:

我正在尝试从 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)

【问题讨论】:

标签: javascript ajax django python-3.x


【解决方案1】:

对于任何遇到此线程的人,对于 Django 2.1,HEADER 键应该是 X-CSRFToken,链接在这里 https://docs.djangoproject.com/en/2.1/ref/csrf/

【讨论】:

    【解决方案2】:

    方法一

    要使用 ajax 发出 post 请求,您需要设置一个名为 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

    出于安全原因,不推荐使用以下方法

    如果您只是出于娱乐目的而非生产目的构建某些东西,您可以始终在设置中关闭 csrf 中间件以摆脱它。

    【讨论】:

    • 感谢您的建议。我使用了 csrf_exempt 并且它不再抛出该错误。但是现在它抛出一个错误,说 View 函数没有返回一个对象。它返回 None 而不是我已经在帖子本身中链接了我的视图函数,知道为什么会这样吗?
    • 你应该检查request.method=="POST"
    • 另外,我建议使用带有调试器的 IDE。它将帮助您查明问题,从而帮助您解决问题。 :)
    猜你喜欢
    • 2019-06-20
    • 2019-11-03
    • 1970-01-01
    • 2018-03-15
    • 2020-09-19
    • 2014-09-10
    • 2021-07-14
    • 2017-09-10
    • 2011-12-26
    相关资源
    最近更新 更多