【问题标题】:Tornado upload error ConnectionResetError龙卷风上传错误 ConnectionResetError
【发布时间】:2015-06-28 13:51:09
【问题描述】:

我已经编写了一个带有上传处理程序的测试龙卷风服务器,按块写入文件。现在我尝试通过请求库将一些文件上传到服务器并得到一个 ConnectionResetError,如果我在没有文件的情况下发出请求,我不会得到这个。

python 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() 不起作用。

【问题讨论】:

    标签: python upload tornado


    【解决方案1】:

    在您的服务器日志中,您应该会在data_received 方法的第一行看到一个未捕获的异常。在@stream_request_body模式下,self.request.body无效;正文数据只能通过data_receivedchunk 参数获得。

    data_received 中存在未捕获的异常时,Tornado 会立即关闭连接,因为大多数客户端在完成上传请求之前不会读取错误响应,因此返回错误页面在带宽方面可能会很昂贵。

    【讨论】:

    • 对不起,我复制粘贴不正确。这行self.request.body 很奇怪......无论如何都会出错
    • 好的,我已经添加了`enable_pretty_logging()`并得到Malformed HTTP message from 127.0.0.1: Content-Length too long。我应该不断增加 max_body_size
    • 是的,app.listen(7777, max_body_size=150*1024*1024),它的工作原理 =) 很棒。谢谢,你的 In your server logs 短语帮助了我
    猜你喜欢
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多