Намерение
Я создаю приложение CRUD для App Engine, где пользователь проходит аутентификацию через OAuth, а сервер сохраняет свои маркеры доступа и обновления в Datastore. Я провожу локальное тестирование с dev_appserver
и застреваю между молотом и наковальней:
- среда выполнения python37 не может импортировать модуль
ndb
для хранилища данных, а среда выполнения python27 не может импортировать модуль google.auth
.
Постановка проблемы
Python37
Во время выполнения python37 обнаружен мой файл require.txt, и все зависимости установлены правильно. Однако, похоже, что эта среда выполнения в настоящее время не имеет встроенной поддержки для модуля ndb
для выполнения вызовов API хранилища данных.
from google.appengine.ext import ndb
ModuleNotFoundError: No module named 'google.appengine'
Одним из способов решения моей проблемы было бы вручную установить пакет ndb, однако я не верю, что он на данный момент имеет открытый исходный код.
Скорее всего, я буду двигаться вперед, используя google-api-python-client
для взаимодействия с хранилищем данных. Однако я по-прежнему заинтересован в решении проблемы, изложенной ниже, чтобы лучше понять, как работают модули Python в App Engine.
python27
В среде выполнения python27 файл require.txt игнорируется. Мой обходной путь должен был включать последние выпуски всего исходного кода зависимостей. Я делаю это, заполняя каталог с именем dependencies
источником и затем добавляя символические ссылки к корневым модулям. (Это также было хорошим упражнением в изучении того, как работает импорт модулей Python)
Структура проекта
Каталог
.
├── api.py
├── app
│ ├── build
│ ├── config
│ ├── dist
│ ├── index.html
│ ├── node_modules
│ ├── package.json
│ ├── package-lock.json
│ ├── src
│ └── static
├── app.yaml
├── dependencies
│ ├── click-7.0
│ ├── flask-1.0.2
│ ├── google-auth-library-python-1.6.3
│ ├── google-auth-library-python-oauthlib-0.3.0
│ ├── itsdangerous-1.1.0
│ ├── jinja-2.10.1
│ └── markupsafe-1.1.1
├── libs
│ ├── click -> ../dependencies/click-7.0/click/
│ ├── flask -> ../dependencies/flask-1.0.2/flask/
│ ├── google -> ../dependencies/google-auth-library-python-1.6.3/google/
│ ├── google_auth_oauthlib -> ../dependencies/google-auth-library-python-oauthlib-0.3.0/google_auth_oauthlib/
│ ├── __init__.py
│ ├── itsdangerous -> ../dependencies/itsdangerous-1.1.0/src/itsdangerous/
│ ├── jinja2 -> ../dependencies/jinja-2.10.1/jinja2/
│ └── markupsafe -> ../dependencies/markupsafe-1.1.1/src/markupsafe/
├── requirements.txt
└── spa.py
Код Python
В файлах моего сервера, spa.py
и api.py
, я включаю libs
в путь python следующим образом:
import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), 'libs'))
Это работает для операторов импорта, таких как
import google_auth_oauthlib.flow # works
и
from flask import Flask, request, session, redirect # works
но это не удается для
import google.auth # does not work
за исключением
Traceback (most recent call last):
File "<HOME>/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 240, in Handle
handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
File "<HOME>/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 299, in _LoadHandler
handler, path, err = LoadObject(self._handler)
File "<HOME>/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 85, in LoadObject
obj = __import__(path[0])
File "<HOME>/vue-scheduler/api.py", line 6, in <module>
import google.auth
File "<HOME>/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/python/runtime/sandbox.py", line 1149, in load_module
raise ImportError('No module named %s' % fullname)
ImportError: No module named google.auth
Полагаю, я правильно все настроил для python для импорта подмодуля auth
. Файлы __init__.py
присутствуют, и должен позволить Python проходить через каталоги вложенных модулей. Однако он не может найти auth
.