Ошибка импорта: нет модуля с именем [каталог] Google App Engine - PullRequest
0 голосов
/ 25 декабря 2018

Я получаю сообщение об ошибке, в котором говорится, что нет модуля с именем backend, это каталог, в котором находится мое приложение webapp2.

Структура моей папки:

/project
 /backend
   /env    #python virtual env libraries
   main.py #my main entry point where webapp2 app instance is
   requirements.txt
 app.yaml

Мой app.yaml:

service: default

handlers:
- url: /dist
  static_dir: dist

- url: /.*
  script: backend.main.app

libraries:
- name: webapp2
  version: latest
- name: jinja2
  version: latest

До того, как мой app.yaml был в бэкэнде, но я решил перейти в root.Теперь, когда я запускаю dev_appserver.py в корне, я получаю ImportError: No module named backend

Я создал virualenv и установил пакеты require.txt в каталог backend.

РЕДАКТИРОВАТЬ: ЯЯ не уверен, что это имеет значение, но я уже развернул свое приложение, когда app.yaml находился внутри папки backend.Я предполагаю, что это не должно иметь значения, поскольку я пытаюсь выполнить локальное тестирование, переместив app.yaml в корень моего проекта и запустив dev_appserver.py app.yaml, но, кажется, это не работает, когда я делаю это.

1 Ответ

0 голосов
/ 25 декабря 2018

Каталог, содержащий файл app.yaml для службы GAE, является каталогом службы верхнего уровня.Содержимое этого каталога будет загружено в GAE при развертывании службы.Все пути, указанные в коде или конфигурациях службы, относятся к этому каталогу верхнего уровня.Таким образом, перемещение файла app.yaml без обновления соответствующего кода и соответствующих настроек нарушит функциональность приложения.

Похоже, вы не очень хорошо понимаете значение выражения script:.From Элемент Handlers :

Директива script: должна представлять собой путь импорта python, например, package.module.app, который указывает на приложение WSGI.Последний компонент директивы script:, использующий путь к модулю Python, - это имя глобальной переменной в модуле: эта переменная должна быть приложением WSGI и обычно называется app по соглашению.

Примечание: так же, как для оператора импорта Python, каждый подкаталог, который является пакетом, должен содержать файл с именем __init__.py

Итак, предположим, что ваш файл app.yaml находится в вашемproject dir,

script: backend.pythonAttack.app

будет означать:

  • с файлом __init__.py внутри backend dir, чтобы сделать backend пакет
  • с файлом pythonAttack.py в каталоге backend, с переменной app, указывающей на ваше приложение webapp2

Согласно вашему описанию, вы этого не сделаетевыполнить любое из этих условий.

Моя рекомендация:

  • сохранить app.yaml внутри backend dir (который не обязательно должен быть каталогом пакета python)
  • обновите строку script, чтобы она соответствовала вашему коду.Предполагая, что переменная app для вашего приложения webapp2 фактически находится в файле main.py, строка будет выглядеть следующим образом:

      script: main.app
    
  • запустить приложение локально, явно передав app.yaml файл в качестве аргумента (в общем, хорошая привычка, а также единственный способ запуска приложений с несколькими службами и / или dispatch.yaml файлом):

    dev_appserver.py backend/app.yaml
    
  • хранить ваш питон службызависимости внутри каталога backend/lib (в соответствии с соглашением об именах), отдельно от ваших пакетов virtualenv

  • храните каталог env virtualenv за пределами каталога backend, чтобы избежать ненужной загрузки их в GAEпри развертывании службы (и потенциальное вмешательство в работу приложения).Цель virtualenv - правильно эмулировать песочницу GAE локально, чтобы вы могли правильно запустить сервер разработки.

Потенциально представляет интерес для структурирования мультисервисного приложения: Может использовать службу по умолчанию/ модуль в приложении Google App Engine может быть родственным по отношению к нестандартному с точки зрения структуры папок?

...