首页 > 解决方案 > Python 请求 - 重试任何状态码,但不是 400

问题描述

我正在使用以下片段(请注意,仅显示部分片段):

from urllib3.util import Retry
status_forcelist = (500, 502, 504)


retry = Retry(
        total=retries,
        read=retries,
        connect=retries,
        backoff_factor=backoff_factor,
        status_forcelist=status_forcelist,
        method_whitelist=frozenset(['GET', 'POST'])

到目前为止,将对状态码500, 502,进行重试504。但是,我打算重试任何状态码,但不是400. status_forcelist有没有一种优雅的方法来实现这一点,而不是为所有状态代码填充/硬编码?

标签: python-3.xpython-requests

解决方案


您可以从request模块中获取代码 - 这样可以节省您将它们写出来的时间。如果引入任何新的,您也会拥有它们:

import requests
from urllib3.util import Retry

status_forcelist = tuple( x for x in requests.status_codes._codes if x != 400)

print(status_forcelist)

输出:

(100, 101, 102, 103, 122, 200, 201, 202, 203, 204, 205, 206, 207, 208, 226, 300, 301, 302, 
 303, 304, 305, 306, 307, 308, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 
 413, 414, 415, 416, 417, 418, 421, 422, 423, 424, 425, 426, 428, 429, 431, 444, 449, 450, 
 451, 499, 500, 501, 502, 503, 504, 505, 506, 507, 509, 510, 511)

警告维基百科列出“自创”/非官方状态代码以及 9xx 左右的专有状态代码,但此列表未涵盖。@zwer 解决方案也将涵盖这些。


推荐阅读