我在Python中使用Requests但总是遇到 BadStatusLine 错误。
我的代码如下:
import requests
ip = 'xx.xx.xx.xx'
port = 80
proxies={
'http': 'http://%s:%s'%(ip, port),
'https': 'https://%s:%s'%(ip, port)
}
url = 'https://url'
d = {'active_id': 117}
r=requests.post(url, data=d, proxies=proxies)
exeptions显示:
File "/root/untitled-5.py", line 13, in <module>
r=requests.post(url, data=d,proxies=proxies, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36'},verify=False)
File "/usr/lib/python2.7/dist-packages/requests/api.py", line 110, in post
return request('post', url, data=data, json=json, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/api.py", line 56, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 488, in request
resp = self.send(prep, **send_kwargs)
File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 609, in send
r = adapter.send(request, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/adapters.py", line 473, in send
raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', BadStatusLine("''",))
我从谷歌找到了一些解决方案。我尝试将最后一行改为:
1 r=requests.post(url, data=d, proxies=proxies, varify=False)
2 r=requests.post(url, data=d, proxies=proxies, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36'})
但没有人真的有效。我想知道为什么以及如何处理这个问题。 谢谢
答案 0 :(得分:0)
当您的Python客户端收到一个空响应(标头/ body)时,您会收到此错误。
BTW较新的Python版本将引发不同的Exception, 服务器断开连接或出现网络问题时,可能会发生这种情况。
就我而言,我们花了数周的时间尝试重制它,直到找到主要原因为止, 我们有一个Python应用程序将请求发送到Nginx负载均衡器后面的服务
我们发现,当客户端超过默认的Nginx配置client_header_timeout / client_body_timeout(60秒)时,Nginx将断开连接,这是Nginx等待客户端的其他数据包的时间。
您可以遵循此参考文献http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout
当我们的应用程序加载有CPU处理时,将建立连接,但标头和请求主体在发送之前会有很长的延迟,超过82秒。
因此Nginx关闭连接并返回重置数据包(记录的tcpdump具有空主体和标头),正式它应该返回状态代码408,这没有发生。
我们通过将两个参数的client_header_timeout / client_body_timeout增加到180s来解决了这个问题:
server {
..
client_body_timeout 180s;
client_header_timeout 180s;
}