为什么请求响应对象__bool__检查200< = status< 400?

时间:2018-01-19 18:19:43

标签: python python-requests

根据source of the Requests module__bool__函数仅用于检查响应的状态代码是否介于200和400之间。

Returns True if :attr:`status_code` is less than 400.
This attribute checks if the status code of the response is between
400 and 600 to see if there was a client error or a server error. If
the status code, is between 200 and 400, this will return True. This
is **not** a check to see if the response code is ``200 OK``.

__bool__函数的使用使得下面的代码不能按预期工作:

def request_url(url):
    error_message = None
    try:
        r = requests.get(url)
    except:
        # Do some other error handling...
        error_message = "Bad request."
        r = None
    return r, error_message

r, error_message = request_url(url)
if r:
    # Do some stuff to the response
    operate_on_response(r)
else:
    # Skip this response object and move to the next.

当我请求的url的状态代码为500时,语句if r:返回False。即使未触发异常,每次出现服务器错误时if r:都会返回False 。我的目的是测试响应对象是否存在。

我不是要求解决方法:我知道我可以检查error_message是否不是None。上面的代码只是一个例子,而不是我正在使用的实际代码。

但是,对我来说,使用__bool__函数检查状态代码是否在两个值之间似乎并不自然或合乎逻辑。就像我说的,我自己可以找到一个解决方法,但我主要是问为什么?为什么这样使用__bool__方法?是否有一些我没有看到的逻辑?

1 个答案:

答案 0 :(得分:8)

如果请求成功,则该方法返回True。 2xx和3xx范围内的状态代码均表示正确且成功的响应,而其他状态代码均表示错误。

在幕后,__bool__方法基本上是response.ok attribute的别名:

  

如果True小于400,则返回status_code,否则返回False

     

此属性检查响应的状态代码是否介于400和600之间,以查看是否存在客户端错误或服务器错误。如果状态代码介于200和400之间,则返回True。这是检查响应代码是否为200 OK。

这与response.raise_for_status() method相呼应,当出现“错误”时会引发HTTPError例外情况。状态代码。

requests API中可以返回Response个实例的任何函数或方法,总是这样做,或者引发异常。您无法从API获得None或其他false-y值,因此没有其他用于测试布尔值的用例。因此,响应的布尔值可以被重载为任何,并且在这里它用于使得容易测试' okayness'回复:

response = requests.get(...)
if response:
    # success! yay, do something meaningful with the response data

这适用于某些用例,而不是为相反的状态引发异常,从服务器获取错误状态。