2012-06-01 2 views
0

장고 프로젝트에서 ajax 요청에 문제가 있습니다. 나는 어디에서 멈추고 500 에러를 리턴하는지 알기 전까지 모든 곳에 print 문을 추가하여 뷰 코드를 디버그하려고했다. 왜 이런 일이 일어나고 있는지 모르겠으니 조금 더 경험이있는 사람이 무엇이 잘못 될지 알기를 바랍니다. 내가 사용django는 뷰에 일반 객체를 만들 수 없으며 500 오류를 반환합니다.

자바 스크립트 라이브러리 (만하지만 아약스 호출) jQuery를하고 GogoMakePlay 있습니다 (GogoMakePlay.com)

응용 프로그램 (GogoMakePlay) 장고와 자바 스크립트에서 백엔드 브라우저 기반의 체스 게임이다 체스 판을 표시하기위한 것. 이 상황에서는 체스 보드가 표시되고 조각을 클릭하면 가능한 이동의 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* 

아약스 요청 코드 :

*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* 

내 장고 콘솔 출력 :

*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 

자바 스크립트에 코드를 작성할 수 있다는 것을 알고 있지만 학교 프로젝트이며 내 목표 중 하나는 아약스 호출 방법을 이해하는 것이 었습니다.

나는 몇 시간 동안 이것을 검색해 왔으며 나의 문제와 관련된 전술 한 링크만을 발견했다. 일반적으로 StackOverflow에는 모든 대답이 있지만이 경우에는이 질문을 할 수 있도록 계정을 만들어야합니다. 제 문제에 대한 해결책과 비슷한 질문이 있으면 용서해주십시오.

그래서 제 질문은 다음과 같습니다

  1. 당신이 나를 도와 더 많은 정보가 필요하십니까? 그렇다면 무엇을 알아야합니까?
  2. 내 아약스 전화가 맞습니까?
  3. 그렇다면 왜 500 오류가 발생합니까? 그렇지 않다면 내가 뭘 잘못하고 있니?
  4. 왜 Pawn 객체가 생성 된 직후 뷰가 실행을 시작하지만 멈 춥니 까?'

    print "created the piece: " + piece 
    

    piece이 폰의 인스턴스이며, 오류가 말한대로, 당신은 할 수 있습니다

+0

이 줄에 중단 점을 설정하려 했습니까? 조각 = 전당포 (pieceColour) 및 예외가 있습니까? – dbf

+0

500을 받으면 브라우저에 오류 페이지가 전송됩니다. Firebug/Chrome 개발자 도구에서 확인할 수 있습니다. 그것은 무엇을 말하는가? –

+0

@DanielRoseman 감사합니다, 나는 내가 "숨겨진"500 오류를 찾을 수 있는지 몰랐습니다. 어쨌든 "str"과 "instance"객체를 연결할 수 없습니다. – user1430067

답변

2

그래서 오류가 디버깅 코드에서 실제로) = 사전에 감사합니다 임의의 객체와 문자열을 연결 만하면됩니다. 파이썬은 PHP가 아닙니다. 강력하게 타입이 지정되어 있습니다.이 작업을 수행하려면 인스턴스를 문자열 표현으로 변환해야합니다. 이 작업을 수행하는 가장 좋은 방법은 문자열로 변환 할 객체의 __unicode__ 메소드를 호출 문자열 형식

print "created the piece: %s" % piece 

을 사용하는 것입니다.

실제로 인쇄물이 아닌 로깅 호출을 사용해야한다는 점에 유의하십시오. 다른 점을 제외하고는 실수로 배포 할 때 코드에 print 문을 남겨두면 모든 것이 손상됩니다. 그래서 정말해야합니다 :

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

(로그인 호출이 인수를 사용하면 인쇄와 같은 % 연산자를 사용 할 필요가 없습니다 문자열이, 자신을 보간 할).

+0

네, 이건 제 실수였습니다. 모든 조각 객체에 대해 __str__ 메소드를 만들었고 Java 에서처럼 자동으로 호출 될 것이라고 가정했습니다. 그러나 "pieceRow = request.POST.get ("row ")"뿐만 아니라 "pieceColumn = request.POST.get ("column ")"은 int로 변환되어야합니다. 선. 고맙습니다. = D – user1430067

+0

오류가 너무 작아서 어떤 일이 잘못 될지 알 수없는 경우, 너무 많은 시간을 연속적으로 코딩하는 것이 확실합니다. = P – user1430067

관련 문제