Google App Engine и jQuery Ajax вызывают ошибку Broken Pipe - PullRequest
3 голосов
/ 02 февраля 2011

У меня довольно стандартный случай, когда я пытаюсь отправить некоторые данные JSON через jjuery's Ajax.

Мой код Java Script выглядит так:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>
<script type='text/javascript' src='script.js'></script>
<script type='text/javascript'>
    $(document).ready(function() {
        $("#submit").click(function() {
            $.post('/test', {test : '123'}, function(data) { alert("callback received"); }, 'json');
        });
    });
</script>

На стороне App Engine у ​​меня есть это:

class Submit(webapp.RequestHandler):
    def post(self):
        logging.info(self.request.body)
        self.response.out.write("test_response")

Я получаю данные в формате JSON logging.info(self.request.body) отлично, но при отправке ответа возникает ошибка. Журнал ошибок, который я получаю, выглядит следующим образом:

Exception happened during processing of request from ('192.168.2.8', 38875)
Traceback (most recent call last):
  File "/usr/lib/python2.6/SocketServer.py", line 283, in handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/lib/python2.6/SocketServer.py", line 309, in process_request
    self.finish_request(request, client_address)
  File "/usr/lib/python2.6/SocketServer.py", line 322, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/home/hw/Siine/google_appengine/google/appengine/tools/dev_appserver.py", line 3123, in init_
    BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, *args, **kwargs)
  File "/usr/lib/python2.6/SocketServer.py", line 618, in __init__
    self.finish()
  File "/usr/lib/python2.6/SocketServer.py", line 661, in finish
    self.wfile.flush()
  File "/usr/lib/python2.6/socket.py", line 297, in flush
    self._sock.sendall(buffer(data, write_offset, buffer_size))
error: [Errno 32] Broken pipe

Я абсолютно не знаю, что я делаю неправильно, поскольку это кажется простым.

Ответы [ 3 ]

4 голосов
/ 06 февраля 2011

Я предполагаю, что вам нужно отменить действие отправки, вызвав .preventDefault() объекта события или вернув false из вашего обработчика.Когда запускается стандартное поведение отправки, браузер уходит со страницы.

2 голосов
/ 27 декабря 2011

Это потому, что dev_appserver является однопоточным и выполняется в одном процессе на вашем компьютере разработчика, поэтому он не может обрабатывать два запроса одновременно.

Как указал Джон, и как вы уже обнаружили, вы посылали два одновременных запроса к dev_server, разрывая канал.

2 голосов
/ 02 февраля 2011

Решение было довольно простым, хотя мне потребовалось некоторое время, чтобы понять его.

В кнопке отправки <input type="submit" id="submit" value="Submit"> вы не можете использовать type="submit".

Я изменил его на type="button", и с тех пор он работает отлично.

Если кто-нибудь знает, почему это так, не стесняйтесь просветить меня. Благодаря.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...