Команда Flask работает в одной среде и не работает в другой - PullRequest
0 голосов
/ 07 марта 2019

У меня есть приложение-колба, работающее на локальной машине при запуске flask run, но оно не работает в AWS EC2.

  • В обеих средах есть Ubuntu 16.04 и Python 2.7.
  • Оба работают в virtualenv, созданных одинаковым образом и по пути (разные папки только у пользователя).
  • Оба имеют одинаковую версию Flask.
  • Оба имеют python-dotenv и .flaskenv file и настроены на разработку и отладку.
  • Оба имеют одинаковую папку проекта (одно и то же git repo) и I flask run в одной папке для обоих.
  • Я определил PORT в.flaskenv и я вижу, что в обоих портах определен PORT, в котором работает колба.

Когда я пытаюсь получить один и тот же URL, в EC2 я получаю сообщение об ошибке: NoAppException: Could not import "app.initialize"

Запуск на локальной машине:

$ flask run
 * Serving Flask app "app.initialize:web_app" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://0.0.0.0:5324/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 179-083-368

Журнал:

127.0.0.1 - - [07/Mar/2019 09:10:13] "GET /api/directors/me/info HTTP/1.0" 200 -

Запуск в режиме EC2:

$ flask run
 * Serving Flask app "app.initialize:web_app" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://0.0.0.0:5324/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 104-758-876

Журнал:

127.0.0.1 - - [07/Mar/2019 12:05:42] "GET /api/directors/me/info HTTP/1.0" 500 -
Traceback (most recent call last):
  File "/home/myuser/.virtualenvs/myvenv/lib/python2.7/site-packages/flask/cli.py", line 325, in __call__
    self._flush_bg_loading_exception()
  File "/home/myuser/.virtualenvs/myvenv/lib/python2.7/site-packages/flask/cli.py", line 313, in _flush_bg_loading_exception
    reraise(*exc_info)
  File "/home/myuser/.virtualenvs/myvenv/lib/python2.7/site-packages/flask/cli.py", line 302, in _load_app
    self._load_unlocked()
  File "/home/myuser/.virtualenvs/myvenv/lib/python2.7/site-packages/flask/cli.py", line 317, in _load_unlocked
    self._app = rv = self.loader()
  File "/home/myuser/.virtualenvs/myvenv/lib/python2.7/site-packages/flask/cli.py", line 371, in load_app
    app = locate_app(self, import_name, name)
  File "/home/myuser/.virtualenvs/myvenv/lib/python2.7/site-packages/flask/cli.py", line 246, in locate_app
    'Could not import "{name}".'.format(name=module_name)
NoAppException: Could not import "app.initialize".

Для этого приложения у меня есть настраиваемая команда фляги, и когда я пытаюсь вызвать эту команду для обеих сред, на локальной машине работаютЭто нормально, но в EC2 я получил ошибку No such command.

Я действительно перепробовал все, что нашел в SO, о проверке правильности импорта, версий пакетов и т. д. В EC2, когда я ipython, Я могу import app.initialize, и я даже могу импортировать модели и использовать код моего приложения для запуска вещей, включая функцию команды.

Наконец, если я запускаю это приложение с помощью Gunicorn в EC2, оно работает нормально, но иногдаМне нужно запустить с flask для отладки (это среда песочницы) и мне тоже нужно запускать пользовательские команды.

Есть идеи, что может быть не так в EC2?

Ty All

1 Ответ

1 голос
/ 07 марта 2019

Вам нужно добавить путь к app к пути python в ec2.Если вы находитесь в каталоге проекта, запустите export PYTHONPATH="$(pwd):$PYTHONPATH".

В основном, если ваш проект выглядит примерно так в файловой системе:

/home
  /myuser
    /myproject
      /app
        __init__.py
        somemodule.py

Тогда вы хотите, чтобы /home/myuser/myproject присутствовал в переменной окружения PYTHONPATH.

Вы захотите автоматизировать это, поскольку эта переменная окружения будет присутствовать только в оболочке, в которой вы выполнили команду. Для этого вам могут потребоваться следующие варианты:

  • ТамМожет быть, вы можете настроить переменные среды с помощью пользовательского интерфейса AWS (не уверен).
  • Вы можете создать или использовать образ, для которого уже настроена PYTHONPATH, и убедиться, что вы поместили свой проект в путь.
  • Вы можете добавить команду экспорта в ~/.profile, если вы используете оболочку от имени того же пользователя, который будет запускать приложение, или /etc/profile, если вы просто хотите добавить путь к приложению длявсе пользователи.Затем перезагрузите сервер.

Но прежде чем беспокоиться об этом, чтобы проверить правильность решения, выполните следующие действия:

  1. SSH в экземпляр ec2
  2. Запустите оболочку Python с помощью python
  3. Запустите этот оператор (он должен завершиться ошибкой из-за ошибки импорта): import app.initialize
  4. Выйдите из оболочки с помощью exit () или ctrl-d
  5. Экспорт пути в app
  6. Повторите шаги 2-3, за исключением того, что на этот раз они должны быть успешными
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...