#python #api #python-requests
Вопрос:
У меня есть список параметров запроса, которые я хочу передать функции в качестве параметра. Эта функция вызывает api, поэтому каждый элемент в этом списке параметров передается соответственно для каждого вызова и извлекает результаты, связанные с этим параметром, пока он не достигнет конца этого списка.
Вот список параметров(каждый элемент в этом списке имеет разный диапазон дат с разным набором результатов).:
REQUEST_PARAMS = [
{
"period": "range",
"date": "2020-10-08,2020-10-31",
"format": "JSON",
"module": "API",
"method": "**",
"flat": "1",
"filter_limit": "-1",
},
{
"period": "range",
"date": "2020-11-01,2020-11-30",
"format": "JSON",
"module": "API",
"method": "**",
"flat": "1",
"filter_limit": "-1",
},
{
"period": "range",
"date": "2020-12-01,2020-12-31",
"format": "JSON",
"module": "API",
"method": "**",
"flat": "1",
"filter_limit": "-1",
}
]
Вот функция, которая вызывает целевой api:
def get_the_results(max_retries=4):
"""
Fetch the response object from the api
:param max_retries: The max number of retries in case of error.
:return: list of dictionaries for the results
"""
return fetch_and_validate_response(URL, REQUEST_PARAMS, max_retries)
def fetch_and_validate_response(url, params, max_retries=0):
"""
Fetch a response object from provided URL.
:param url: The url for the request
:param params: The parameters for the request
:param max_retries: The max number of retries in case of error.
:return: json object if successful, None if retries due to network error continues to fail
"""
try:
response = get(url=url, params=params, verify=False)
response.raise_for_status()
response_decoded = response.json()
# Raise a RequestException if the API returns a result with an error.
try:
if response_decoded.get('result') == 'error':
log.info(f"Error in response: {response_decoded.get('result')} - {response_decoded.get('message')}")
raise RequestException
except AttributeError:
log.info("No error detected in response object.")
return response_decoded
except HTTPError as e:
log.exception(f'Network Error: HTTP error {response.status_code} occurred while getting query: {url}: {e}')
except ConnectionError as e:
log.exception(f'Network Error: A connection error occurred while getting query: {url} with {params}: {e}')
except Timeout as e:
log.exception(f'Network Error: The request timed out for query: {url} with {params}: {e}')
except RequestException as e:
log.exception(f'Network Error: An error occurred while getting {url}. Please double-check the url: {e}')
if max_retries <= 0:
return None
time.sleep(5)
return fetch_and_validate_response(url, params, max_retries - 1)
Я хочу распечатать результаты, полученные в результате этого вызова в этой функции:
def construct_results_dict():
data = get_the_results()
for item in data:
print(item)
мы очень ценим вашу помощь — Спасибо 🙂
Комментарии:
1. Зацикливайтесь на
REQUEST_PARAMS
них и передавайте их своей функции.2. @Ram Я попробовал это решение, оно выбирает только первый элемент и возвращает свой собственный результат, после чего вызов завершен!
3. Это происходит потому, что вы используете
return
в своей функции, и поэтому функция останавливается после первого вызова. Не могли бы вы опубликовать свой полный код?
Ответ №1:
Вы могли бы сделать что-то подобное.
Выполните итерацию по REQUEST_PARAMS
списку и вызовите fetch_and_validate_response()
каждый параметр, а затем сохраните возвращаемые значения fetch_and_validate_response()
в списке и верните этот список.
def get_the_results(max_retries=4):
"""
Fetch the response object from the api
:param max_retries: The max number of retries in case of error.
:return: list of dictionaries for the results
"""
# results list to store the results returned by the below function
results = []
for param in REQUEST_PARAMS:
results.append(fetch_and_validate_response(URL, param, max_retries))
# Finally return the results list
return results
И теперь results
список будет возвращен data
в приведенной ниже функции.
def construct_results_dict():
data = get_the_results()
for item in data:
print(item)