Как правильно импортировать модули Python для dev_appserver? - PullRequest
2 голосов
/ 23 апреля 2019

Намерение

Я создаю приложение 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.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Для стандартной среды GAE 1-го поколения (Python 2.7) зависимости обработки приложений немного отличаются от обычных приложений Python. Постарайтесь не проявлять творческий подход, так как вам будет труднее получить помощь, если у вас возникнут проблемы.

Для библиотек, включенных в предоставленные GAE встроенные сторонние библиотеки, вы можете просто запросить их в вашем app.yaml файле.

Сторонние библиотеки, не предоставляемые GAE (или библиотеки, для которых вы намеренно хотите использовать свои собственные версии / копии), должны быть скопированы / встроены в ваше приложение.

Выберите только один метод, попытка сделать оба для одной и той же библиотеки также может вызвать проблемы.

0 голосов
/ 23 апреля 2019

Библиотека ndb ORM недоступна для Python 3. Вы также можете:

  1. Доступ к Cloud Datastore через API Cloud Datastore. Вы можете использовать клиентские библиотеки Google Cloud для хранения и извлечения данных из Cloud Datastore.
  2. Подождите, пока ndb будет перенесен на Python 3. В настоящее время это происходит, вы можете следить здесь: https://github.com/Googleapis/python-ndb

Продолжение использования среды выполнения Python 2.7 не рекомендуется, поскольку Python 2.7 достигнет конца срока службы 1 января 2020 года.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...