2017-05-25 21 views
2

我正在运行基于Bottle框架的Web服务器。这个框架公开了一个可以上传文件的端点。有时,如果磁盘已满,则Web服务器应该返回代码429而不读取文件。出于某种原因,当我上传文件,如果服务器试图返回429个状态码下面的异常引发:如果Web服务器返回错误,但仅当上传大文件时,请求库会引发ConnectionError

File "../hooks.py", line 325, in post_video_content 
    response = requests.post(url, data=fh) 
    File "/usr/local/lib/python2.7/site-packages/requests/api.py", line 110, in post 
    return request('post', url, data=data, json=json, **kwargs) 
    File "/usr/local/lib/python2.7/site-packages/requests/api.py", line 56, in request 
    return session.request(method=method, url=url, **kwargs) 
    File "/usr/local/lib/python2.7/site-packages/requests/sessions.py", line 488, in request 
    resp = self.send(prep, **send_kwargs) 
    File "/usr/local/lib/python2.7/site-packages/requests/sessions.py", line 609, in send 
    r = adapter.send(request, **kwargs) 
    File "/usr/local/lib/python2.7/site-packages/requests/adapters.py", line 473, in send 
    raise ConnectionError(err, request=request) 
ConnectionError: ('Connection aborted.', error(32, 'Broken pipe')) 

但如果试图完全一样的职位,但不是发布一个文件,我只是发布一些少量的数据,我实际上从请求中获得了一个响应对象,我可以检查状态码。

重现:

webserver.py

from bottle import Bottle, route, run, request, response, get, post, put, abort 

@post('/content') 
@authenticate 
def content(): 
    response.status = 429 
    return "failed to write incoming movie to temp file (space might be full temporarily)" 

run(host="127.0.0.1", port=8080, debug=True) 

send_request.py

import requests 


# this works and prints the status code 
ret = requests.post("127.0.0.1:8080/content", data="sdfsdfsdfsdf") 
print ret.status_code 

# this part will throw an exception 
try: 
    with open("~/some_large_video_file.mp4", 'rb') as fh: 
     ret = requests.post('127.0.0.1:8080/content', data=fh) 
except: 
    print traceback.format_exc() 

编辑 - 我发现,这取决于数据量。如果您尝试发布类似10KB的数据,我们将获得429的返回代码。我试图找出导致它开始引发异常的限制。

EDIT2 - 所以它看起来像魔术文件大小介于117K和131K之间。如果我尝试使用前者,它会按照预期工作,我会从请求中获得响应并可以访问状态码。如果我尝试前者,我会引发异常。

我的问题是:

  1. 为什么会出现这种情况?这是瓶子里的错误吗?请求中的错误?为什么我发布的数据的大小/类型会改变回复?
  2. 有什么办法可以解决这个问题吗?我试图将ConnectionError异常与服务器关闭相关联,并且429响应代码表示磁盘已满。如果我得到同样的例外,我都无法分辨阻止我执行退避等待磁盘空间开放的情况之间的区别

回答

1

因此,我交叉发布此请求github问题页面,看起来问题在httplib模块中,请求建立在该模块之上,所以这是目前没有解决的问题。

看到:https://github.com/kennethreitz/requests/issues/4062

+0

作为回答,您应该考虑这个标记, – user3351605

+0

它不会让我的另一天左右 –

相关问题