requests.codes.ok 是否包含 304?

29 投票
4 回答
51820 浏览
提问于 2025-04-17 22:54

我有一个程序,它使用requests模块发送一个GET请求,结果正确地返回了304 "未修改"。在发出请求后,我检查一下response.status_code == requests.codes.ok,但是这个检查失败了。requests模块是不是不把304当作“正常”状态呢?

4 个回答

0

.ok "..如果状态码在200到400之间,这个会返回True。"

在源代码中提到:

"""如果status_code小于400,就返回True;否则返回False。 这个属性会检查响应的状态码是否在400到600之间,以判断是否有客户端错误或服务器错误。如果状态码在200到400之间,这个会返回True。这不是用来检查响应码是否是200 OK。"""

4

你可以在这里查看requests.status代码的实现,链接是源代码
这个实现让你可以像下面这样访问各种状态码

import requests
import traceback
url = "https://google.com"
req = requests.get(url)
try:
    if req.status_code == requests.codes['ok']: # Check the source code for all the codes
        print('200')
    elif req.status_code == requests.codes['not_modified']: # 304
        print("304")
    elifreq.status_code == requests.codes['not_found']: # 404
        print("404")
    else:
        print("None of the codes")
except:
    traceback.print_exc(file=sys.stdout)

总之,你可以像示例那样访问任何请求和响应。我相信还有更好的方法,但这个对我来说是有效的。

49

Response 对象中,有一个叫做 ok 的属性。如果状态码不是 4xx5xx,这个属性会返回 True

所以你可以这样做:

if response.ok:
    # 304 is included

这个属性的代码其实很简单:

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

你可以在这个链接查看实际的代码:源代码。这里的 ok 只表示状态码 200。

撰写回答