【问题标题】:Forbidden (CSRF cookie not set.) in Django jQuery POSTDjango jQuery POST 中的禁止(未设置 CSRF cookie。)
【发布时间】:2020-05-12 16:39:29
【问题描述】:

我有一个 Django 3 应用程序,在引导模式上带有 jQ​​uery Ajax 帖子。 很少有按钮没有任何形式,但使用 post 调用某些 url。

所有 Django 方法都按照此处所述实现:https://docs.djangoproject.com/en/3.0/ref/csrf/ 所有标头都已正确发送。

当用户登录以及用户退出后,页面和功能都可以正常工作。

但是,Ajax 调用返回错误响应为 Forbidden(CSRF cookie 未设置。),当第一次访问该站点时以及在未登录时处于隐身模式时。一​​旦用户登录,即使在用户登录后问题也得到解决出去。

请指导可能的原因。

编辑:根据 cmets 的要求,PFB 是众多 Ajax 调用之一。

<script>
        $('.likelink').on("click", function (event){
            event.preventDefault();
            var postid = $(this).attr("data-catid");
            $.ajax({
                type: 'POST',
                url: "{% url 'like_post' %}",
                data: {"post_id": postid},
                success: function (response){
                    if(response["valid"]){
                        alert("Yeah!!! You Liked the post :)");
                        $('#likelinkid'+postid).remove();
                    }
                    else{
                        alert("Kindly login to Like!!!");
                    }
                },
                error: function (response){
                    alert(response["responseJSON"]["error"]);
                }
            });
            });
</script>

同样有多个脚本排列在不同的锚标记上。如问题中所述,当用户登录和用户注销后,上述脚本工作正常。

编辑2:仅供参考,我正在编写按照Django文档使用的csrf相关代码:

<script type="text/javascript">
        function getCookie(name) {
            var cookieValue = null;
            if (document.cookie && document.cookie !== '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i < cookies.length; i++) {
                    var cookie = cookies[i].trim();
                    // Does this cookie string begin with the name we want?
                    if (cookie.substring(0, name.length + 1) === (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
            return cookieValue;
        }
        var csrftoken = getCookie('csrftoken');
        function csrfSafeMethod(method) {
            // these HTTP methods do not require CSRF protection
            return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
        }
        $.ajaxSetup({
            beforeSend: function(xhr, settings) {
                if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                    xhr.setRequestHeader("X-CSRFToken", csrftoken);
                }
            }
        });
</script>

除了上述之外,我还尝试过使用视图装饰器@requires_csrf_token 和@ensure_csrf_cookie,但这并没有解决上述问题。

【问题讨论】:

  • 你能分享你的 AJAX 调用吗?
  • @iklinac 你明白我已经在我的问题中提到了这个链接并且同样的实现了吗?
  • @WillemVanOnsem 我已经添加了相同的内容。请检查。
  • 您没有在问题中提供任何代码,除了将您链接回文档之外,您认为有人可以如何帮助您

标签: python jquery django ajax


【解决方案1】:

通过将 jQuery CDN 引用从子模板移动到基本模板并替换 BootStrap 的苗条 jQuery 引用来解决此问题。

Bootstrap 在基础模板中较早的 slim jQuery 引用导致与子模板中引用的 minified jQuery 重叠问题。我曾这样使用它,希望在不需要完整 jQuery 的网页上获得更好的性能,但它没有帮助。

因此,在使用 Bootstrap 时,请确保您在扩展模板中只引用了一个 jQuery,并且最好在其他 Bootstrap 引用之前。

【讨论】:

    猜你喜欢
    • 2012-05-03
    • 2016-11-26
    • 2021-10-08
    • 1970-01-01
    • 2022-09-27
    • 2021-09-16
    • 2020-01-16
    • 2017-10-07
    • 2015-05-22
    相关资源
    最近更新 更多