#python #http #gcloud #google-api-python-client #timeoutexception
#python #http #gcloud #google-api-python-client #исключение timeoutexception
Вопрос:
Я использую этот код, который иногда получает тайм-ауты при попытке подключиться к серверу. Теперь я пытаюсь найти способ уменьшить время ожидания, чтобы refresh() выдавал исключение быстрее, чем через 120 секунд.
def _get_access_token():
"""Retrieve a valid access token that can be used to authorize requests."""
credentials = Credentials.from_service_account_file(os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
scopes=['https://www.googleapis.com/auth/firebase.messaging'])
request_succeeded = False
while True: # Try until we get a token from Google.
try:
credentials.refresh( google.auth.transport.requests.Request() ) # Change timeout time here?
access_token = credentials.token
request_succeeded = True
except:
print("Exception occurred, connecting to Google again...")
if request_succeeded:
break
# Write access token to file:
f = open("access_token_firebase.txt", "w")
f.write(access_token)
f.close()
if __name__ == "__main__":
start_time = time.time()
_get_access_token()
print("Python script finished. Took: %s seconds to complete." % round(time.time() - start_time, 2) )
Ответ №1:
Вы можете использовать эту ссылку в качестве ссылки. Как вы можете видеть там, вы должны объявить свой тайм-аут и использовать его в запросе, как показано ниже
def __call__(
self,
url,
method="GET",
body=None,
headers=None,
timeout=_DEFAULT_TIMEOUT,
**kwargs
):
"""Make an HTTP request using requests.
Args:
url (str): The URI to be requested.
method (str): The HTTP method to use for the request. Defaults
to 'GET'.
body (bytes): The payload / body in HTTP request.
headers (Mapping[str, str]): Request headers.
timeout (Optional[int]): The number of seconds to wait for a
response from the server. If not specified or if None, the
requests default timeout will be used.
kwargs: Additional arguments passed through to the underlying
requests :meth:`~requests.Session.request` method.
Returns:
google.auth.transport.Response: The HTTP response.
Raises:
google.auth.exceptions.TransportError: If any exception occurred.
"""
try:
_LOGGER.debug("Making request: %s %s", method, url)
response = self.session.request(
method, url, data=body, headers=headers, timeout=timeout, **kwargs
)
return _Response(response)
except requests.exceptions.RequestException as caught_exc:
new_exc = exceptions.TransportError(caught_exc)
six.raise_from(new_exc, caught_exc)
Комментарии:
1. Спасибо за ответ! Я прочитал документацию, но я не могу понять, как использовать функцию вызова . Я пробовал что-то вроде этого: ` while True: # Попробуйте, пока мы не получим токен от Google. попробуйте: ответ = google.auth.transport.requests. Запрос().__вызов__(‘ accounts.google.com/o/oauth2/auth ‘, тайм-аут = 10) учетные данные.обновить (ответ) access_token = учетные данные.токен ` но это не работает. И из того, что я могу сказать, невозможно передать аргумент timeout при создании экземпляра класса Request.
2. По этой другой ссылке github.com/googleapis/google-auth-library-python/blob/master /… вы можете найти другой пример того, как его использовать. И что касается вашего последнего вопроса, это невозможно.