2017-05-25 137 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

它不會讓我的另一天左右 –

相關問題