Javascript django无法在视图中创建常规对象,返回500错误

Javascript django无法在视图中创建常规对象,返回500错误,javascript,python,ajax,django,view,Javascript,Python,Ajax,Django,View,我在django项目中遇到ajax请求问题。我曾尝试通过到处添加print语句来调试视图代码,直到我发现它似乎停止并返回500个错误。我不知道为什么会发生这种情况,所以我希望有经验的人知道出了什么问题 我使用的javascript库是jQuery(仅用于ajax调用)和GogoMakePlay(GogoMakePlay.com) 该应用程序是一款基于浏览器的国际象棋游戏,后端使用django和javascript(GogoMakePlay)显示棋盘。在这种情况下,将显示棋盘,当我单击一个棋子时,

我在django项目中遇到ajax请求问题。我曾尝试通过到处添加print语句来调试视图代码,直到我发现它似乎停止并返回500个错误。我不知道为什么会发生这种情况,所以我希望有经验的人知道出了什么问题

我使用的javascript库是jQuery(仅用于ajax调用)和GogoMakePlay(GogoMakePlay.com)

该应用程序是一款基于浏览器的国际象棋游戏,后端使用django和javascript(GogoMakePlay)显示棋盘。在这种情况下,将显示棋盘,当我单击一个棋子时,它应该对django视图进行ajax调用,该视图返回可能移动的json。我每次点击一个棋子,这样我的打印功能就会被执行,我本应该能够找到问题,但这次不行

我的问题和这个差不多:

除了和他不同之外,我的问题并没有消失

有关意见:

def get_move_options(request):
  if request.POST:
    # initialise some variables based on the request type
    pieceType = request.POST.get("pieceType")
    pieceColour = request.POST.get("pieceColour")
    pieceRow = request.POST.get("row")
    pieceColumn = request.POST.get("column")
    gameId = request.POST.get("gameId")
    game = Game.objects.get(pk=gameId)
    moves = Move.objects.filter(game=game)
    print "initialised all the variables"

    # check what type of piece it is
    if pieceType == "pawn":
        print "colour:" + pieceColour
        piece = Pawn(pieceColour)
        print "created the piece: " + piece # <-- this is never executed                                           
    elif pieceType == "king":
        piece = King(pieceColour)
    elif pieceType == "queen":
        piece = Queen(pieceColour)
    elif pieceType == "bishop":
        piece = Bishop(pieceColour)
    elif pieceType == "knight":
        piece = Knight(pieceColour)
    elif pieceType == "rook":
        piece = Rook(pieceColour)
    print "created the piece: " + piece
    # make a new board and apply the moves to it
    board = Board()
    for move in moves:
        board.makeMove(move)
    print "made all the moves"

    # get the possible moves
    responseList = piece.getMoveOptions(pieceColumn, pieceRow, board)

  return HttpResponse(json.dumps(responseList), mimetype="application/javascript")
ajax请求代码:

*snip*
// get the csrf_token from the page TODO there must be a better way of doing this
var csrf_token = document.getElementById("csrf_token").getElementsByTagName("input")[0].value;

// add the variables to the post data
var data = {
        "gameId" : gameId,
    "pieceType" : piece.S.type,
    "pieceColour" : piece.S.colour,
    "column" : column,
    "row" : row,
    };
var url = "ajax/getMoveOptions";
// make the ajax call
$.ajax({
        type : 'POST',
        // add the csrf_token or we will get a 403 response
    headers : {
    "X-CSRFToken" : csrf_token
    },
    url : url,
    data : data,
    dataType : "json",
    success : function(json) {
    // loop through the json list
    for(var i = 0; i < json.length; i++) {
        // change the square colour of the options
    var x = json[i]["row"];
    var y = json[i]["column"];
    var option = G.O["square" + y + x];
    if(y % 2 == x % 2) {
            var squareColour = "white";
    } else {
        var squareColour = "black";
    }
    option.setSrc("/static/images/board/" + squareColour + "Option.png").draw();
    }
},
error : alert("I have now seen this too many times"),
});
*snip*
我知道我可以用javascript编写代码,但这是一个学校项目,我的目标之一是了解如何进行ajax调用

我在谷歌上搜索了几个小时,只找到了上面提到的与我的问题有关的链接。通常StackOverflow有所有的答案,但在这种情况下,我不得不创建一个帐户,以便我可以问这个问题。请原谅,如果有一个类似的问题与解决我的问题

因此,我的问题是:

  • 你需要更多的信息来帮助我吗?如果是,你需要知道什么
  • 我的ajax调用正确吗
  • 如果是,为什么它会给出500个错误?如果不是,那我做错了什么
  • 为什么视图开始执行,但在创建典当对象后立即停止

  • 提前感谢=)

    因此,错误实际上存在于调试代码中:

    print "created the piece: " + piece 
    
    piece
    是Pawn的一个实例,正如错误所说,不能将字符串与随机对象连接起来。Python不是PHP——它是强类型的,为了做到这一点,您需要将实例转换为它的字符串表示形式。最好的方法是使用字符串格式

    print "created the piece: %s" % piece 
    
    它将调用对象的
    \uuuuUnicode\uuuu
    方法将其转换为字符串

    请注意,您应该真正使用日志调用而不是打印—除此之外,如果在部署时不小心在代码中留下了一条打印语句,那么一切都将中断。所以它应该是:

    logging.info('created the piece: %s', piece)
    

    (日志调用接受参数并自行进行字符串插值,因此您不需要像打印一样使用
    %
    运算符)。

    您是否尝试为此行设置断点:piece=Pawn(pieceColour)并检查是否有任何异常等?如果您得到的是500,然后,您将收到一个发送到浏览器的错误页面。您可以在Firebug/Chrome开发工具中看到它。上面写着什么?@DanielRoseman谢谢你,我不知道我能找到“隐藏的”500错误。无论如何,它说:“无法连接'str'和'instance'对象”将您的代码放入try-except..捕获未处理的异常并发布回溯,这样看来我在打印函数中添加了一个bug,而真正的错误是当我进入“piece.getMoveOptions(pieceColumn,pieceRow,board)”时在计算某个if语句时,似乎出现语法错误。所以发布的代码实际上是不相关的。是的,这是我的错误,我为我的所有工件对象创建了str方法,并假设它会像在Java中一样被自动调用。但是,“pieceRow=request.POST.get(“row”)以及“pieceColumn=request.POST.get(“column”)应该被转换为int,这就是导致问题进一步恶化的原因。非常感谢您的帮助=d当一个人的错误如此微不足道,但却无法找出到底出了什么问题时,这是一个明显的迹象,表明他已经连续编写了太多小时的代码=P
    print "created the piece: %s" % piece 
    
    logging.info('created the piece: %s', piece)