2012-06-01 53 views
0

我在django項目中遇到了ajax請求的問題。我試圖通過在任何地方添加print語句來調試視圖代碼,直到我發現它似乎停止並返回500錯誤。我不知道爲什麼會發生這種情況,所以我希望有更多經驗的人知道發生了什麼問題。django無法在視圖中創建常規對象,返回500錯誤

我使用的JavaScript庫是jQuery的(僅適用於Ajax調用,雖然)和GogoMakePlay(GogoMakePlay.com)

應用程序是一個基於瀏覽器的國際象棋比賽在Django和JavaScript的後端(GogoMakePlay)用於顯示棋盤。在這種情況下,會顯示棋盤,當我點擊一塊棋子時,它應該對ajax調用django視圖,該視圖返回可能移動的json。我每次都點擊一個棋子,這樣我的打印功能就可以執行了,我應該能夠找到問題,但這次不行。

我的問題是幾乎相同的,因爲這一個:

Cannot create new Django model object within Ajax post request

除了與他不同,我的問題並沒有就此消失。

有問題的視圖:

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調用。

我一直在Google上搜索幾個小時,發現只有前面提到的與我的問題有關的鏈接。通常StackOverflow有所有的答案,但在這種情況下,我被迫創建一個帳戶,以便我可以問這個問題。請原諒我是否有類似的問題解決我的問題。

所以我的問題是:

  1. 你需要更多的信息來幫助我嗎?如果是這樣,你需要知道什麼?
  2. 我的ajax調用是否正確?
  3. 如果是這樣,爲什麼會發出500錯誤?如果不是,那麼我做錯了什麼?
  4. 爲什麼視圖開始執行,但在Pawn對象創建後立即停止?

預先感謝您=)

+0

您是否嘗試爲此行設置斷點:piece = Pawn(pieceColour)並檢查是否有任何異常,等等? – dbf

+0

如果你得到一個500,那麼你會得到一個錯誤頁面發送到瀏覽器。你可以在Firebug/Chrome開發者工具中看到它。它說什麼? –

+0

@丹尼羅斯曼謝謝你,我不知道我可以去找到「隱藏」500錯誤。無論如何它說:「不能連接'str'和'實例'對象」 – user1430067

回答

2

因此,錯誤實際上是在你的調試代碼:

print "created the piece: " + piece 

piece是典當的一個實例,並作爲錯誤說,你可以」只是將字符串與隨機對象連接起來。 Python不是PHP--它是強類型的,爲了做到這一點,你需要將實例轉換爲它的字符串表示。要做到這一點,最好的辦法是使用字符串格式化

print "created the piece: %s" % piece 

這將調用對象的方法__unicode__將其轉換爲一個字符串。

請注意,您應該真正使用日誌記錄調用而不是打印 - 除了其他任何情況,如果在部署時不小心將代碼留在代碼中,則所有內容都會中斷。因此,它確實應該:

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

(logging調用的接受的參數並執行路線插值自己,所以你不需要使用%運營商與打印)。

+0

是的,這是我的錯誤,我爲我的所有對象製作了__str__方法,並假定它會像Java一樣自動調用。然而,「pieceRow = request.POST.get(」row「)」以及「pieceColumn = request.POST.get(」column「)」應該被轉換爲一個int值,這就是導致我的問題進一步下降線。非常感謝你的幫助= D – user1430067

+0

當一個人的錯誤是微不足道的,但人們無法弄清楚什麼是錯誤的,這是一個明顯的跡象,一個人已經連續編了好幾個小時了! = P – user1430067

相關問題