Как я могу изменить _DEFAULT_TIMEOUT (120 секунд) в библиотеке Python Google.auth.transport.requests?

#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 /… вы можете найти другой пример того, как его использовать. И что касается вашего последнего вопроса, это невозможно.