Jquery 即使我使用了csrf_令牌,Ajax也无法工作

Jquery 即使我使用了csrf_令牌,Ajax也无法工作,jquery,ajax,django,Jquery,Ajax,Django,我有一个使用django的网络游戏项目 首先,当我使用ajax get方法带来用户字符数据时 它工作得很好 (function(){ $("document").ready(function(){ $get_id = $('#character'); //현재 로그인 된 유저가 케릭터를 갖고 있는지 확인하는 코드 $user_has_character = $(".data").data("hasCharacter");

我有一个使用django的网络游戏项目

首先,当我使用ajax get方法带来用户字符数据时

它工作得很好

(function(){
    $("document").ready(function(){

        $get_id = $('#character');

        //현재 로그인 된 유저가 케릭터를 갖고 있는지 확인하는 코드
        $user_has_character = $(".data").data("hasCharacter");


        /*****************************
         * when user have character
         * ***************************/
        if($user_has_character=="True"){

            get_gamestart_api_url = '/api/gamestart/data/';

            //게임 화면 태그
            $scene = $('#scene');

            $scene.css("background", "url(../static/images/game/loadingBackground.jpg) no-repeat");

        /*****************************
         * 
         * json will get user's character data
         * 
         * **************************/
        $.ajax({

            method:'GET',
            url:get_gamestart_api_url,

        }).done(function(data){
                character = data[0].character[0]
                $get_id.append("<li class='stat'> 케릭터 닉네임: "+character.nickname+"</li>",
                    "<li class='stat'> 케릭터 레벨: "+character.level+"</li>",
                    "<li class='stat'> 케릭터 직업: "+character.job+"</li>",
                    "<li class='stat'> 케릭터 공격력: "+character.status.attack_point+"</li>",
                    "<li class='stat'> 케릭터 수비력: "+character.status.defence_point+"</li>",
                    "<li class='stat'> 케릭터 체력: "+character.status.health+"</li>",
                    "<li class='stat'> 케릭터 마나: "+character.status.mana+"</li>",
                    );
            });


    }else{
        /*********************
         * When the user does not have a character
         ********************/

    }

});
})();
尽管我使用了jquery csrf_令牌,但在发送$.ajax帖子时, 它显示错误

Forbidden (CSRF token missing or incorrect.): /

但我无法理解我的代码中有什么问题…

假设此
脚本
在HTML中,而不是在外部
.js
文件中,您可以重写以下内容:

$get_id.append("<form method='post' action='/'> <input name='nickname' type='text' style='...'><input type='submit' class='btn_character'> </form>");
$get\u id.append(“”);
为此:

$get_id.append("<form method='post' action='/'>{% csrf token %} <input name='nickname' type='text' style='...'><input type='submit' class='btn_character'> </form>");
$get_id.append(“{%csrf-token%}”);
当您将数据发布到Django时,必须将与其他表单数据一起发布。这就是你犯错误的原因

csrf_令牌
由服务器生成,并作为隐藏输入注入表单中

如果此脚本位于其自己的文件中,并且您将其作为:
加载到HTML中,则您有2个选项:

  • 不是以这种方式加载它,而是使用它,以便Django可以呈现此值。例如,您应该将它(包括
    标记!)保存为
    game\u script.html
    。然后在HTML模板中按如下方式注入:

    
    斯塔夫在这里。。。
    ... 在底部
    {%include'game_script.html%}
    

  • 另一个选项是在动态创建表单之前,向服务器发出另一个AJAX请求以获取
    csrf令牌
    ,一旦获得该令牌,然后创建表单(在
    append
    中),包括收到的
    csrf\u令牌


  • 然而,最简单的解决方案不是向Django发出
    POST
    请求,而是发出
    GET
    请求。简单地说,将
    method='post'
    更改为
    method='get'
    ,就可以开始了。没有
    csrf令牌
    需要它。

    这是因为您需要
    csrftoken
    值,但服务器尚未生成该值。它不包含在您的
    表单中
    !你解决问题了吗?@nik_m噢,很抱歉我解决了我的问题,但我删除了“.js”文件并重新编写,我不明白是什么问题,但我解决了我的问题。如果我的回答帮助你解决了这个问题,请接受。这是StackOverflow的一个很好的实践!
    $get_id.append("<form method='post' action='/'>{% csrf token %} <input name='nickname' type='text' style='...'><input type='submit' class='btn_character'> </form>");