我正在運行基於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之間。如果我嘗試使用前者,它會按照預期工作,我會從請求中獲得響應並可以訪問狀態碼。如果我嘗試前者,我會引發異常。
我的問題是:
- 爲什麼會出現這種情況?這是瓶子裏的錯誤嗎?請求中的錯誤?爲什麼我發佈的數據的大小/類型會改變回復?
- 有什麼辦法可以解決這個問題嗎?我試圖將
ConnectionError
異常與服務器關閉相關聯,並且429響應代碼表示磁盤已滿。如果我得到同樣的例外,我都無法分辨阻止我執行退避等待磁盤空間開放的情況之間的區別
作爲回答,您應該考慮這個標記, – user3351605
它不會讓我的另一天左右 –