当前位置: 首页 > 面试题库 >

如何在python请求库中实现重试机制?

朱越
2023-03-14
问题内容

我想在python请求库中添加重试机制,因此正在使用它的脚本将重试非致命错误。

目前,我确实认为三种错误是可以恢复的:

  • HTTP返回码502、503、504
  • 找不到主机(现在不太重要)
  • 请求超时

在第一阶段,我想每分钟重试指定的5xx请求。

我希望能够透明地添加此功能,而不必为从这些使用python-requests的脚本或库中进行的每个HTTP调用手动实现恢复。


问题答案:

通过扩展requests.Session类,我可以获得所需的可靠性。

这是代码https://bitbucket.org/bspeakmon/jira-
python/src/a7fca855394402f58507ca4056de87ccdbd6a213/jira/resilientsession.py?at=master

编辑 该代码是:

from requests import Session
from requests.exceptions import ConnectionError
import logging
import time


class ResilientSession(Session):

    """
    This class is supposed to retry requests that do return temporary errors.

    At this moment it supports: 502, 503, 504
    """

    def __recoverable(self, error, url, request, counter=1):
        if hasattr(error,'status_code'):
            if error.status_code in [502, 503, 504]:
                error = "HTTP %s" % error.status_code
            else:
                return False
        DELAY = 10 * counter
        logging.warn("Got recoverable error [%s] from %s %s, retry #%s in %ss" % (error, request, url, counter, DELAY))
        time.sleep(DELAY)
        return True


    def get(self, url, **kwargs):
        counter = 0
        while True:
            counter += 1
            try:
                r = super(ResilientSession, self).get(url, **kwargs)
            except ConnectionError as e:
                r = e.message
            if self.__recoverable(r, url, 'GET', counter):
                continue
            return r

    def post(self, url, **kwargs):
        counter = 0
        while True:
            counter += 1
            try:
                r = super(ResilientSession, self).post(url, **kwargs)
            except ConnectionError as e:
                r = e.message
            if self.__recoverable(r, url, 'POST', counter):
                continue
            return r

    def delete(self, url, **kwargs):
        counter = 0
        while True:
            counter += 1
            try:
                r = super(ResilientSession, self).delete(url, **kwargs)
            except ConnectionError as e:
                r = e.message
            if self.__recoverable(r, url, 'DELETE', counter):
                continue
            return r

    def put(self, url, **kwargs):
        counter = 0
        while True:
            counter += 1
            try:
                r = super(ResilientSession, self).put(url, **kwargs)
            except ConnectionError as e:
                r = e.message

            if self.__recoverable(r, url, 'PUT', counter):
                continue
            return r

    def head(self, url, **kwargs):
        counter = 0
        while True:
            counter += 1
            try:
                r = super(ResilientSession, self).head(url, **kwargs)
            except ConnectionError as e:
                r = e.message
            if self.__recoverable(r, url, 'HEAD', counter):
                continue
            return r

    def patch(self, url, **kwargs):
        counter = 0
        while True:
            counter += 1
            try:
                r = super(ResilientSession, self).patch(url, **kwargs)
            except ConnectionError as e:
                r = e.message

            if self.__recoverable(r, url, 'PATCH', counter):
                continue
            return r

    def options(self, url, **kwargs):
        counter = 0
        while True:
            counter += 1
            try:
                r = super(ResilientSession, self).options(url, **kwargs)
            except ConnectionError as e:
                r = e.message

            if self.__recoverable(r, url, 'OPTIONS', counter):
                continue
            return r


 类似资料:
  • 本文向大家介绍python实现三种随机请求头方式,包括了python实现三种随机请求头方式的使用技巧和注意事项,需要的朋友参考一下 相信大家在爬虫中都设置过请求头 user-agent 这个参数吧? 在请求的时候,加入这个参数,就可以一定程度的伪装成浏览器,就不会被服务器直接识别为spider.demo.code ,据我了解的,我很多读者每次都是直接从network 中去复制 user-agent

  • 问题内容: 如何在纯SQL中请求随机行(或尽可能接近真正的随机行)? 问题答案: 参见这篇文章:SQL从数据库表中选择一个随机行。它介绍了在MySQL,PostgreSQL,Microsoft SQL Server,IBM DB2和Oracle中执行此操作的方法(以下内容从该链接复制而来): 使用MySQL选择一个随机行: 使用PostgreSQL选择一个随机行: 使用Microsoft SQL

  • 本文向大家介绍如何基于Python + requests实现发送HTTP请求,包括了如何基于Python + requests实现发送HTTP请求的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了如何基于Python + requests实现发送HTTP请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一、在接口自动化测试过程中,存在

  • 我正在尝试向CloudScrape的在线网站scraper发出API请求,文档显示了以下示例。 POST /api/runs/{runId}/执行/输入/等待HTTP/1.1 X-CloudScrape-Access: ga09usdm8osdf8n9sodf X-CloudScrape-Account:87750c5f-7423-4438-b3f1-7b8b86990621 接受:applica

  • 我创建了一个简单的python程序,使用请求模块发送Post Api请求

  • 当两个客户端都登录到游戏中并准备就绪后,每个客户端依次做出一个“移动”,并将其发送给服务器授权。在服务器授权移动后,它会发送2条消息:1)第一条消息给做出“移动”的玩家,告诉他它的移动被批准,现在它应该“等待”另一个对手上场。2)第二条消息,给对手,告诉他什么士兵移动了,现在轮到他上场了。...bla bla bla bla 我的问题是:当每个客户端登录到游戏时,为他创建了一个新的套接字,用于与服