背景
今天有用户在访问web系统时,出现了Nginx返回的超时报错。经排查是由于某台服务器异常,导致web系统requests请求时,一直等待响应,等待时间超过了Nginx配置的超时时间,所以Nginx就直接返回了。
思路
- 配置timeout
一般在使用requests
库时,是不设置超时时间的,那么请求就会一直等待,直到某一方关闭。所以在发请求的时候手工指定下timeout
参数。
requests
的timeout
配置如下:
1 | def request(method, url, **kwargs): |
官网介绍如下:
如果你制订了一个单一的值作为timeout
,如下所示:
1 | r = requests.get('https://github.com', timeout=5) |
这一timeout
值将会用作 connect
和 read
二者的 timeout
。如果要分别制定,就传入一个元组:
1 | r = requests.get('https://github.com', timeout=(3.05, 27)) |
如果远端服务器很慢,你可以让 Request
永远等待,传入一个None
作为timeout
值,然后就冲咖啡去吧。
1 | r = requests.get('https://github.com', timeout=None) |
http://docs.python-requests.org/zh_CN/latest/user/advanced.html#timeout
- 捕获异常
通过try... except...
可以捕获异常。获取的异常信息如下:
在老版本的python
中,有e.message
可以获取str
格式的报错信息,但要注意的是,虽然在定义中e.message
是str
类型的,但是实际上未必。类型错误的话,在后续的处理中就可能会造成其他异常了。
1 | # e.message 定义 |
而在新版本的python
中,e.message
已经被淘汰了。
1 | class BaseException(object): |
https://www.python.org/dev/peps/pep-0352/#transition-plan
所以可以用e.args
来获取异常说明,e.args
返回的是一个tuple
,直接通过str(e.args)
转换成str
类型做后续处理。
结论
代码如下,对不通原因造成的异常,可以加不同的except
。
1 | import requests |