Advertisement
kopyl

http requests retrier Python

Jan 16th, 2024 (edited)
785
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.21 KB | None | 0 0
  1. import os
  2. import sys
  3. import time
  4. import requests
  5.  
  6.  
  7. p = print
  8.  
  9.  
  10. class CurrentDatetime:
  11.  
  12.     date = time.strftime('%d %b %Y')
  13.     time = time.strftime('%H:%M:%S')
  14.  
  15.     def __str__(self):
  16.         return f"{self.date} {self.time}"
  17.  
  18.  
  19. def get_caught_error(additional_message=""):
  20.     exc_type, exc_obj, exc_tb = sys.exc_info()
  21.     fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
  22.     message = (
  23.         f"Now {CurrentDatetime()}\n"
  24.         f"\"{fname}\" caught an error "
  25.         f"{exc_type.__name__} "
  26.         f"on line {exc_tb.tb_lineno}:\n"
  27.         f"\"{exc_obj}\""
  28.         f"\n\n{additional_message}"
  29.     )
  30.     return message
  31.  
  32.  
  33. def define_retry_delay_seconds(
  34.     retry_time_count: int
  35. ) -> int:
  36.  
  37.     retry_in_seconds = 1 * retry_time_count
  38.     if retry_in_seconds > 1800:
  39.         retry_in_seconds = 1800
  40.     return retry_in_seconds
  41.  
  42.  
  43. def retry_request_till_success(
  44.     request: requests.models.Request
  45. ) -> requests.models.Response:
  46.  
  47.     def wrapper(*args, **kwargs):
  48.         retry_time_count = 1
  49.         while True:
  50.             retry_in_seconds = define_retry_delay_seconds(retry_time_count)
  51.             try:
  52.                 if ( response := request(*args, **kwargs) ) == None:  # doc.id#13
  53.                     p("There is no request to retry")
  54.                     break
  55.                 while True:
  56.                     retry_in_seconds = define_retry_delay_seconds(
  57.                         retry_time_count
  58.                     )
  59.                     if (r := response.status_code) in [200, 404]:
  60.                         break
  61.                     else:
  62.                         if (
  63.                             response
  64.                         ).status_code not in [200, 404]:
  65.                             p(
  66.                                 f"URL: {response.url} "
  67.                                 f"Request in {request.__name__} failed. "
  68.                                 f"Status_code – {response.status_code} "
  69.                                 f"Will retry again in {retry_in_seconds} seconds"
  70.                             )
  71.                             time.sleep(retry_in_seconds)
  72.                             retry_time_count += 1
  73.                             response = request(*args, **kwargs)
  74.                         else:
  75.                             break
  76.                 return response
  77.             except (
  78.                 requests.ConnectTimeout,
  79.                 requests.exceptions.ReadTimeout
  80.             ) as e:
  81.                 error = get_caught_error()
  82.                 p(
  83.                     f"Request in {request.__name__} failed. "
  84.                     f"Timed out with error {error}"
  85.                     f"Will retry again in {retry_in_seconds} seconds"
  86.                 )
  87.                 time.sleep(retry_in_seconds)
  88.                 retry_time_count += 1
  89.             except requests.exceptions.ConnectionError as e:
  90.                 sleep_time = 10
  91.                 p(
  92.                     f"Request in {request.__name__} failed @"
  93.                     f"{CurrentDatetime()}. "
  94.                     "No connection to internet... "
  95.                     f"Will retry again in {sleep_time} seconds"
  96.                 )
  97.                 time.sleep(sleep_time)
  98.     return wrapper
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement