先說明一下當時的情況,下午遇到一個需求需要先從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由於提供了對協程的支持,所以就恢復了正常。現在看來情況應該是這樣,上面的文章的分析僅供參考了。。