0

我在 django 项目中遇到 ajax 请求问题。我试图通过在任何地方添加打印语句来调试视图代码,直到我发现它似乎停止并返回 500 错误。我不知道为什么会这样,所以我希望有更多经验的人知道出了什么问题。

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

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

我的问题和这个差不多:

无法在 Ajax 发布请求中创建新的 Django 模型对象

除了不像他,我的问题并没有消失。

有问题的观点:

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")

典当代码:

 class Pawn(Piece):
   def __init__(self, colour):
     print "creating object"
     self.colour = colour
     print "object created, the colour is: " + colour
 *snip*

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*

我的 Django 控制台输出:

 *snip*
 [01/Jun/2012 02:07:45] "GET /static/images/chess_pieces/white/king.png HTTP/1.1" 200 1489
 initialised all the variables
 colour:white
 creating object
 object created, the colour is: white
 [01/Jun/2012 02:07:48] "POST /game/ajax/getMoveOptions HTTP/1.1" 500 10331

我知道我可以只用 javascript 编写代码,但这是一个学校项目,我的目标之一是了解如何进行 ajax 调用。

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

所以我的问题是:

  1. 您需要更多信息来帮助我吗?如果是这样,你需要知道什么?
  2. 我的ajax调用正确吗?
  3. 如果是这样,为什么会出现 500 错误?如果没有,那我做错了什么?
  4. 为什么视图开始执行但在 Pawn 对象创建后立即停止?

提前谢谢你=)

4

1 回答 1

2

因此,错误实际上在您的调试代码中:

print "created the piece: " + piece 

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

print "created the piece: %s" % piece 

这将调用对象的__unicode__方法将其转换为字符串。

请注意,您实际上应该使用记录调用而不是打印 - 除了其他任何事情之外,如果您在部署时不小心在代码中留下了打印语句,那么一切都会中断。所以它真的应该是:

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

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

于 2012-06-01T08:58:30.373 回答