Flask命令在一个环境中运行,而不在另一个环境中运行

时间:2019-03-07 12:26:32

标签: python flask amazon-ec2

运行flask run时,我有一个烧瓶应用程序在本地计算机上运行,​​但未在AWS EC2中运行。

  • 两个环境都具有Ubuntu 16.04和Python 2.7。
  • 两者都在以相同方式和路径创建的virtualenvs中运行(仅用户的文件夹不同)。
  • 两者具有相同的Flask版本。
  • 两者都有python-dotenv.flaskenv文件,并设置为 开发和调试。
  • 两者都具有相同的项目文件夹(相同的git repo),而我flask run 两者都在同一个文件夹中。
  • 我在.flaskenv中定义了端口,可以看到该端口已定义 两者都在烧瓶中运行。

当我尝试获取相同的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".

对于这个应用程序,我有一个自定义的flask命令,当我尝试在两种环境下调用此命令时,在本地计算机上都可以正常工作,但是在EC2中我遇到了No such command错误。

我真的尝试了在SO中找到的所有有关检查事物是否正确导入,软件包版本等的内容。在EC2中,当我ipython时,我可以import app.initialize,甚至可以导入模型并使用我的应用程序代码来运行程序,包括命令功能。

最后,如果我在EC2中使用Gunicorn运行该应用程序,则可以正常工作,但有时我需要使用flask运行以进行调试(在沙箱环境中),并且还需要运行自定义命令。

您知道EC2可能有什么问题吗?

全部收录

1 个答案:

答案 0 :(得分:1)

您需要将app的路径添加到ec2的python路径。如果您在项目目录中,请运行export PYTHONPATH="$(pwd):$PYTHONPATH"

基本上,如果您的项目在文件系统中看起来像这样:

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

然后,您要在环境变量/home/myuser/myproject中包含PYTHONPATH

您将要自动执行此操作,因为该环境变量仅会在您运行命令的外壳程序中出现。为此,您可以使用以下一些可能的选项:

  • 可能有一种方法可以让您通过AWS UI(不确定)配置环境变量。
  • 您可以创建或使用已设置PYTHONPATH的图像,并确保将项目放在路径中。
  • 如果您以将要运行应用程序的同一用户身份运行外壳程序,则可以将导出命令添加到~/.profile,如果您只是想为应用程序添加路径,则可以将导出命令添加到/etc/profile。所有用户。然后重新启动服务器。

但是在为此担心之前,请按照以下步骤测试解决方案的正确性:

  1. SSH进入ec2实例
  2. 使用python
  3. 启动python shell
  4. 运行以下语句(由于导入错误,该语句将失败):import app.initialize
  5. 使用exit()或ctrl-d退出外壳
  6. 将路径导出到app
  7. 重复步骤2-3,但这次应该成功