2014-11-12 2 views
0

내가 내 토네이도 서버에 데이터를 전송하기 위해 노력하고있어 ajax를 사용하여 요청을 읽을 수 없습니다, 이건 내 JQuery와 있습니다 :토네이도가 JSON 아약스는

$("#addTask").submit(function(e){ 
    e.preventDefault(); 
    var add = $('#addProject').val(); 
    var added={projectAdded:add}; 
     $.post("/task", 
       JSON.stringify(added), 
     function(data){ 
      window.location.reload(true); 
       }); 
    }); 
$('#addProject').val();의 값은 입력 텍스트 필드에서입니다

:

$('<div class="input-group col-sm-7"><input type="text" form="task" class="form-control" id="addProject" name="projectAdd" value="" placeholder="New tag"> 
<button type="submit" name="addTag" value="addTag" form="task" id="addTask"></button> </div>').appendTo('#proj'); 

class TaskAddHandler(BaseHandler): 
    def post(self): 
     addProj = json.loads(self.request.body)  
     print 'NEW TASK', addProj 

을하지만이 나에게 오류를 제공합니다 : 내 토네이도 서버에서

내가 가진 012 입력 텍스트 필드 값 대신.

답변

0

JSON 문자열을 데이터가 아닌 객체로 보내야한다고 생각합니다. JSON.stringify ({projectAdded : add})를 객체 대신 사용하십시오.

+0

감사합니다.이 작업을 시도해 보았지만 여전히 동일한 오류가 발생합니다. – user94628

+0

좋아, JSON.stringify가 필요하지 않은 것 같습니다. 아마 jQuery가 개체를 JSON으로 자동 변환합니다. 파이썬 3을 사용하고 있습니까? Tornado 프로젝트를 Python 2에서 Python 3로 전환 할 때 추가해야했습니다.Tornado는 바이트를 읽었고 json.loads는 문자열을 예상 했으므로 decode()는 self.request.body에 전달됩니다 (파이썬 3에서는 바이트가 아니라 유니 코드). 그러나, 나는 당신이보고있는 것보다 다른 오류가있어서, 그렇지 않을 수도 있습니다. –

4

데이터는 self.request.arguments입니다. 또한 유효한 json을 클라이언트에 반환해야합니다.

class AjaxHandler(tornado.web.RequestHandler): 

    def post(self): 
     my_data = self.request.arguments['test_data'] 
     # do something with my_data 
     self.write(json.dumps({'status': 'ok'})) 
     self.finish() 

핸들러에서 self.write(json.dumps({'status': 'ok'})) 응답은 고객과의 거래를 완료 할 필요가있다 : 유효한 JSON 할 것; 내용이 무엇인지는 중요하지 않습니다. (클라이언트가 다시 JSON을 얻을 수가없는 경우 this answer를 참조하십시오.) 또한 run_server.pysettings_xsrf_cookies: True 일 수 있었다

. 이 경우 ajax 요청 자체가 Tornado에 의해 차단되며 콘솔에 400 Bad Request이 표시됩니다.

"XSRF 토큰은 이라는 헤더 (X-XSRFToken)를 통해 전달 될 수 있습니다"라고 doc은 말합니다. 어떤 페이지의 get을 통해 쿠키를 설정하거나 self.xsrf_token을 통해 ajax 로직을 포함하는 쿠키를 설정하십시오. 이렇게하면, 사이먼이 말한다, "부작용으로 쿠키를 설정하는 것이 충분하다"

class PageHandler(tornado.web.RequestHandler): 
    def get(self): 
     self.xsrf_token 
     self.render('page.html') 
다음 (JQuery와 $.cookie plugin를 통해 여기) 클라이언트에 쿠키를 선택할 수 있습니다

:

var token = $.cookie('_xsrf'); 

삽입 전화에서 사용자 지정 headers 매개 변수로 토큰 :

$.ajax({ 
    url: '/task', 
    headers: {'X-XSRFToken' : token }, 
    data: {'test_string': 'test success'}, 
    dataType: "JSON", 
    type: "POST", 
    success: function (data , status_text, jqXHR) { 
     alert('ajax success') 
    }, 
    error: function (data , status_text, jqXHR) { 
     alert('ajax fail') 
    }, 
}); 

다른 방법으로는, 당신은 또한 data의 필드 중 하나를 넣을 수 있습니다. (그리고 당신은 ajax 당신의 필드 중 하나와 같은 자바 스크립트 객체를 보내고,있는 경우 해야JSON.stringify 그것을 얻기 위해에 다시 서버 측 dict을 잘 구조화) :

var packet = {"_xsrf": $.cookie("_xsrf"), "test_string": "test success", "js_obj": JSON.stringify(js_obj)}; 

$.ajax({ 
    url: '/task', 
    data: packet, 
    dataType: "JSON", 
    type: "POST", 
    success: function (data , status_text, jqXHR) { 
     alert('ajax success') 
    }, 
    error: function (data , status_text, jqXHR) { 
     alert('ajax fail') 
    }, 
}); 

또한 예를 들어 있습니다 doc에 언급 된 sample chat app_xsrf_cookies을 관리해야합니다.