python requests response值判断

好久没写文章了,前些日子在忙活婚礼的事情.  9 2 在韩国婚礼算是完美结束了。 一生的另一半算是妥当了,心轻松了,可以放荡了. 

这段时间在技术上没太多的思考的,只是碰到几个虾米小问题。 往往问题不大,也会致使你花心思去排解。  今遇到一个reqeusts返回值的一个问题,花了不短时间调,后来发现是reqeusts返回的对象也含有 魔法函数 处理。 我这边的业务是cdn的刷新预缓存,对于该项目来说 http code 200, 2xx, 404 都是友好的。 

后期会有更新补遗,原文连接,http://xiaorui.cc/?p=4803

#xiaorui.cc

import requests
r = None
try:
    r = requests.get("http://xiaorui.cc/123123")
except:
    pass
if r:
    print "ok"

为什么没有输出ok ?  按照常理来说,只要r不为 零值,就可以匹配到True.  但这次的返回是 <Response [404]>,为什么404会引起 if r 判断异常。 

> type(r)

> requests.models.Response


看 requests的源代码可以很容易分析出该问题。

# xiaorui.cc

class Response(object):
    """The :class:`Response <Response>` object, which contains a
    server's response to an HTTP request.
    """

    __attrs__ = [
        '_content', 'status_code', 'headers', 'url', 'history',
        'encoding', 'reason', 'cookies', 'elapsed', 'request'
    ]

    def __init__(self):
        super(Response, self).__init__()

        self._content = False
        self._content_consumed = False

        #: Integer Code of responded HTTP Status, e.g. 404 or 200.
        self.status_code = None

    def __repr__(self):
        return '<Response [%s]>' % (self.status_code)

    def __bool__(self):
        return self.ok

   @property
   def ok(self):
       try:
           self.raise_for_status()
       except HTTPError:
           return False
       return True

    def raise_for_status(self):
    ¦   """Raises stored :class:`HTTPError`, if one occurred."""

    ¦   http_error_msg = ''

    ¦   if 400 <= self.status_code < 500:
    ¦   ¦   http_error_msg = '%s Client Error: %s for url: %s' % (self.status_code, self.reason, self.url)

    ¦   elif 500 <= self.status_code < 600:
    ¦   ¦   http_error_msg = '%s Server Error: %s for url: %s' % (self.status_code, self.reason, self.url)

    ¦   if http_error_msg:
    ¦   ¦   raise HTTPError(http_error_msg, response=self)

END.


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc