При попытке использовать Google OAuth2 с Docker нет модуля под названием «запросы» - PullRequest
0 голосов
/ 24 июня 2018

Я пытаюсь использовать Google OAuth для своего веб-приложения. Для этого я установил пакеты google-api-python-client и google-auth в моем venv и во время сборки Docker (из файла require.txt). Несмотря на это, когда я запускаю свое приложение, оно не может найти модуль запросов, жалуясь, что:

flask.cli.NoAppException: While importing "debateit", an ImportError was raised:

Traceback (most recent call last):
  File "/usr/local/lib/python3.5/site-packages/google/auth/transport/requests.py", line 23, in <module>
    import requests
ImportError: No module named 'requests'

Импорт выглядит следующим образом:

from google.auth.transport import requests

и используется как:

idinfo = id_token.verify_oauth2_token(token, requests.Request(), app.config["GOOGLE_LOGIN_CLIENT_ID"])

Другие операции импорта, такие как id_token.verify_oauth2_token, работают нормально.

Я проверил сборку докера и там написано, что я правильно включил google-auth:

Installing collected packages: ... google-auth, httplib2, google-auth-httplib2, google-api-python-client
Successfully installed ... google-api-python-client-1.7.3 google-auth-1.5.0 google-auth-httplib2-0.0.3 httplib2-0.11.3 ...

Я хорошо вижу модуль google.auth.transport.requests, когда смотрю в venv, он просто не работает в самом приложении.

Что мне не хватает? Что может привести к тому, что этот модуль не будет найден?

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Итак, я выяснил, в чем дело - в модуле google.auth.transport.requests они пытаются импортировать библиотеку «запросов».У меня не было этой библиотеки установлено.Я сделал это, и теперь это работает.

В руководстве, которому я следовал: https://developers.google.com/identity/sign-in/web/backend-auth не упоминалось, что вам нужно установить эту библиотеку.Я неправильно понял, что должен был делать импорт для запросов в модуле запросов.

0 голосов
/ 24 июня 2018

Как указано в документации , это должно быть более вероятно, как:

import google.auth.transport.requests
import requests

request = google.auth.transport.requests.Request()

credentials.refresh(request)

Но для вашей цели я предложу:

from google.auth.transport.requests import Request

тогдаизмените следующие значения:

idinfo = id_token.verify_oauth2_token(token, requests.Request(), app.config["GOOGLE_LOGIN_CLIENT_ID"])

на:

idinfo = id_token.verify_oauth2_token(token, Request(), app.config["GOOGLE_LOGIN_CLIENT_ID"])

Это была ошибка, поскольку внутри пути google.auth.transport.requests нет функции или класса с именем requests.

Мое предложение основано на строке

idinfo = id_token.verify_oauth2_token(token, requests.Request(), app.config["GOOGLE_LOGIN_CLIENT_ID"])

, которая показывает нам, что вы используете класс с именем Requests(), который присутствует в google.auth.transport.requests, как вы можете видеть в документация .

...