2015-06-28 3 views
1

Я написал тестовый сервер торнадо с загрузчиком, который записывает файл кусками. Теперь я пытаюсь загрузить некоторый файл на сервер через библиотеку запросов и получить ConnectionResetError, если я сделаю запрос без файла, я не получу его.Ошибка загрузки Tornado ConnectionResetError

питона 3,4, 4,1 Торнадо

server.py:

from tornado.ioloop import IOLoop 
from tornado.web import Application, RequestHandler, stream_request_body 

@stream_request_body 
class UploadHandler(RequestHandler): 

    def prepare(self): 
     self.file = open('uploaded_file', 'wb') 

    def data_received(self, chunk): 
     print(len(chunk)) 
     self.file.write(chunk) 

    def post(self, *args, **kwargs): 
     self.file.close() 
     self.write('UPLOADED') 


app = Application([(r'/upload', UploadHandler), ], 
        debug=True) 


if __name__ == '__main__': 
    app.listen(7777) 
    IOLoop.current().start() 

Вот что я получаю:

>>> import requests 
>>> resp = requests.post('http://localhost:7777/upload', files={'file': open('book.pdf', 'rb')}) 

Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
    File "/home/dim/env/lib/python3.4/site-packages/requests/api.py", line 109, in post 
    return request('post', url, data=data, json=json, **kwargs) 
    File "/home/dim/env/lib/python3.4/site-packages/requests/api.py", line 50, in request 
    response = session.request(method=method, url=url, **kwargs) 
    File "/home/dim/env/lib/python3.4/site-packages/requests/sessions.py", line 465, in request 
    resp = self.send(prep, **send_kwargs) 
    File "/home/dim/env/lib/python3.4/site-packages/requests/sessions.py", line 573, in send 
    r = adapter.send(request, **kwargs) 
    File "/home/dim/env/lib/python3.4/site-packages/requests/adapters.py", line 415, in send 
    raise ConnectionError(err, request=request) 
requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer')) 

>>> resp = requests.post('http://localhost:7777/upload') 
>>> resp.status_code 
200 

Что я сделал не так? Я прочитал, что это ошибка сервера. self.prepare() выполняется, но self.data_received() и post() не работают.

ответ

0

В журналах вашего сервера вы должны увидеть неперехваченное исключение из первой строки вашего метода data_received. В режиме @stream_request_body, self.request.body недействителен; данные тела доступны только по аргументу chunk до data_received.

Когда в data_received есть неперехваченное исключение, Tornado немедленно закрывает соединение, так как большинство клиентов не будут считывать ответ об ошибке до тех пор, пока не завершит загрузку запроса, поэтому возвращение страницы с ошибкой является потенциально дорогостоящим с точки зрения пропускной способности.

+0

Извините, я скопировал некорректно. Эта строка 'self.request.body' была нечетной ... Получите ошибку в любом случае – r45i

+0

Хорошо, я добавляю' enable_pretty_logging() 'и получаю' Malformed HTTP-сообщение от 127.0.0.1: Content-Length too long'. Я должен увеличить max_body_size по соображениям – r45i

+1

Да, 'app.listen (7777, max_body_size = 150 * 1024 * 1024)' и он работает =) отлично. Thx, фраза 'В вашем сервере журнала' помогла мне – r45i

Смежные вопросы