关于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由于提供了对协程的支持,所以就恢复了正常。现在看来情况应该是这样,上面的文章的分析仅供参考了。。 

posted @ 2016-02-01 20:32  piperck  阅读(7207)  评论(2编辑  收藏  举报