關於flask自帶web應用服務器Werkzeug 使用requests請求時出現的錯誤。


先說明一下當時的情況,下午遇到一個需求需要先從jd那邊拿到圖片然后上傳到本地的cdn服務器來獲取對應的ident 和地址。

於是就需要首先拿到京東的圖片url,然后按照圖片url去請求圖片到內存然后再將圖片上傳到cdn上來獲取cdn返回的ident和url。

 

其實,着么解釋起來並不是一個復雜的需求

 

但是今天,當我用python requests包去上傳的時候卻出現了這個報錯

Traceback (most recent call last):
  File "create_jd_goods_to_xcf.py", line 38, in <module>
    print get_jd_goods(1)
  File "create_jd_goods_to_xcf.py", line 28, in get_jd_goods
    xcf_info_pic = create_xcf_pic(sku_id, PREFIX_PIC, API_KEY, API_SECRETKEY, jd_goods_info_pic)
  File "/home/piperck/project/kepler/kepler/broker/xcf_api.py", line 35, in create_xcf_pic
    primary_pic, vice_pics = xcf_get_request_file(URL, data, primary_pic, vice_pics, api_secretkey)
  File "/home/piperck/project/kepler/kepler/modules/xcfapi.py", line 52, in xcf_get_request_file
    vps = [requests.post(url, data=payload, files={'image': vice_pic}).text for vice_pic in vice_pics]
  File "/home/piperck/miniconda2/envs/laplace/lib/python2.7/site-packages/requests/api.py", line 109, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "/home/piperck/miniconda2/envs/laplace/lib/python2.7/site-packages/requests/api.py", line 50, in request
    response = session.request(method=method, url=url, **kwargs)
  File "/home/piperck/miniconda2/envs/laplace/lib/python2.7/site-packages/requests/sessions.py", line 465, in request
    resp = self.send(prep, **send_kwargs)
  File "/home/piperck/miniconda2/envs/laplace/lib/python2.7/site-packages/requests/sessions.py", line 573, in send
    r = adapter.send(request, **kwargs)
  File "/home/piperck/miniconda2/envs/laplace/lib/python2.7/site-packages/requests/adapters.py", line 415, in send
    raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', BadStatusLine("''",))

網上搜了一下,並沒有什么答案。於是就開始着手排錯了

首先,我懷疑是是由於我使用了列表解析式所產生的問題,因為有五個圖片在一個數組里,我直接寫了一個列表解析式輪流用requests包去請求京東的圖片。

vice_pics = [requests.get(vice_pic).content for vice_pic in vice_pics]

然后再使用 同樣的方式將他們輪流上傳到公司的cdn上

 vps = [requests.post(url, data=payload, files={'image': vice_pic}).text for vice_pic in vice_pics]

於是就出現了上面的報錯。

 

在排除了並非是圖片下載的問題之后,所有的目光都集中在請求我們自己的openapi接口上。由於使用的是測試服務器,所以使用的是flask自帶的Werkzeug應用服務器。使用的是app.run()這種命令調用的測試服務器。很遺憾,做了一萬種測試之后,發現還是報相同的錯。百思不得其解。

 

也懷疑過,可能是請求速度過快造成的。但是在使用了time.sleep(10)之后,依然是報同樣的效果,所以基本上可以 排出這種可能。剩下的可能就是服務器bug了。

 

后來在更換了測試啟動的wsgi服務器之后,就可以正常訪問和請求了。暫時使用了gevent 提供的wsgi測試服務器就可以正常返回了。這真的非常奇怪,也非常折騰。弄了兩個小時,證明了兩件事情。

 

1. 二進制流對象是可以使用數組保存的。

2. 要多從不同的角度嘗試可能發生錯誤的原因。

 

 

 

----------------------------2016年7月28日補充----------------------------

這可能並不是因為flask服務器引發的問題,我記得當時那個項目使用了gevent協程庫,但是似乎沒有使用monkey_patch對服務器進行包裝。導致可能使用的socket等東西都還是標准庫里面的東西,在我這邊使用請求的時候就發生了錯誤。 所以后來換成gevent提供的wsgi由於提供了對協程的支持,所以就恢復了正常。現在看來情況應該是這樣,上面的文章的分析僅供參考了。。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM