Bisher habe ich die Lösung implementiert die Anfrage unabhängig vom Statuscode erneut zu versuchen, und es funktioniert einwandfrei. Ich habe jedoch Schwierigkeiten, den Statuscode des ersten Aufrufs in der Funktion main() an die Dekoratorfunktion retry_requests zu übergeben.
Wenn beispielsweise der Statuscode 404 war, möchte ich, dass der Dekorator retry_requests dies bestätigt und den Dekorator überhaupt NICHT AUSFÜHRT. Wenn der Statuscode 5xx war, möchte ich, dass der retry_requests-Dekorator bestätigt, dass die retry_requests ausgeführt werden.
Bei mir funktioniert Folgendes Code unten.
Code: Select all
import requests, time
def retry_requests(func, retries=3):
def retry_wrapper(*args, **kwargs):
attempts = 0
while attempts < retries:
try:
return func(*args, **kwargs)
except requests.exceptions.RequestException as e:
print(f"Error as {e}.")
attempts +=1
time.sleep(3)
return retry_wrapper
@retry_requests
def get_request():
response = requests.get("https://this-url-does-not-exist-sorry-jwsgudkaad")
status_code = response.status_code
return status_code
def main():
status_code = get_request()
if __name__ == '__main__':
main()
Code: Select all
while (attempts < retries) and (status_code > 5):
Ich habe versucht, den Statuscode hier als Argument zu übergeben:
Code: Select all
def retry_requests(func, retries=3):
def retry_wrapper(status_code, *args, **kwargs):
attempts = 0
while (attempts < retries) and (status_code > 500):
try:
return func(*args, **kwargs)
except requests.exceptions.RequestException as e:
print(f"Error as {e}.")
attempts +=1
time.sleep(3)
return retry_wrapper
@retry_requests(status_code)
def get_request():
response = requests.get("https://restful-booker.herokuapp.com/mamsma")
status_code = response.status_code
return status_code
Wenn ich ihn innerhalb der Funktion definiere, erhalte ich TypeError : retry_requests() fehlt 1 erforderliches Positionsargument: 'status_code'
Ich möchte die Funktion nicht erneut ausführen, bevor ich sie zurückgebe. Ich möchte nur auf die zurückgegebenen Ausgaben des ersten Aufrufs im Dekorator zugreifen.