0

djangoプロジェクトでajaxリクエストに問題があります。停止して500エラーが返されるように見える場所が見つかるまで、どこにでもprintステートメントを追加してビューコードをデバッグしようとしました。なぜこれが起こっているのかわからないので、もう少し経験のある人が何が悪いのかを知ってくれることを望んでいました。

私が使用しているjavascriptライブラリは、jQuery(ただし、ajax呼び出しのみ)とGogoMakePlay(GogoMakePlay.com)です。

このアプリケーションは、チェス盤を表示するためのdjangoとjavascript(GogoMakePlay)のバックエンドを備えたブラウザベースのチェスゲームです。この状況では、チェス盤が表示され、駒をクリックすると、可能な動きのjsonを返すdjangoビューにajax呼び出しを行うことになっています。印刷機能が実行されるように毎回ポーンピースをクリックしますが、今回は問題を見つけることができなかったはずです。

私の問題はこれとほとんど同じです:

AjaxPOSTリクエスト内に新しい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でコードを書くことができることは知っていますが、これは学校のプロジェクトであり、私の目標の1つは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 に答える