【问题标题】:Flask command running in an environment and not running in anotherFlask 命令在一个环境中运行,而不是在另一个环境中运行
【发布时间】:2019-03-07 21:41:10
【问题描述】:

我有一个烧瓶应用程序,它在运行 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".

对于这个应用程序,我有一个自定义的烧瓶命令,当我尝试为这两个环境调用这个命令时,在本地机器上工作正常,但在 EC2 中我收到 No such command 错误。

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

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

知道 EC2 可能出了什么问题吗?

全部

【问题讨论】:

    标签: python flask amazon-ec2


    【解决方案1】:

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

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

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

    然后你想让/home/myuser/myproject 出现在环境变量PYTHONPATH 中。

    您需要自动执行此操作,因为该环境变量只会出现在您运行命令的 shell 中。要做到这一点,您有一些潜在的选择:

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

    但在担心这个之前,要测试解决方案是否正确,请按照以下步骤操作:

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

    【讨论】:

    • import app.initialize 在python 和ipython 中工作,如果我从应用文件夹所在的项目文件夹运行它。这就是造成更多麻烦的原因,因为我一直认为当前文件夹在 linux 中默认总是添加到 PYTHONPATH 中,因为这个测试有效。不知道为什么在没有在 PYTHONPATH 中设置文件夹的情况下导入在 python 中起作用,但 export PYTHONPATH=$PYTHONPATH:/home/my-user/project-folder & flask run 起作用了。谢谢 Sam,我会在我的环境中设置这个 var。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 2023-01-24
    相关资源
    最近更新 更多