关于python:如何在AWS弹性beanstalk上部署结构化Flask应用程序

How to deploy structured Flask app on AWS elastic beanstalk

使用此处概述的步骤成功部署测试应用程序后:http://docs.aws.amazon.com/elasticbeanstack/latest/dg/create_deploy_python_flask.html

我尝试部署实际的烧瓶应用程序,其结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
myApp/
   runServer.py
   requirements.txt
   myApp/
      __init__.py
      helpers.py
      clean.sh
      static/
         myApp.css
      handlers/
         __init__.py
         views.py
      templates/
         layout.html
         viewOne.html
         viewTwo.html

其中views.py包含我的URL映射。

我尝试在根目录中以及在myApp模块和git aws.push中初始化eb实例,但在AWS仪表板上出现以下错误:ERROR Your WSGIPath refers to a file that does not exist.和应用程序不工作(404用于任何路径)。

如何将上述Flask应用程序部署到弹性豆茎上?


我在将flask应用程序部署到具有类似目录结构的eb时遇到了类似的问题,必须做两件事:

  • 更新my manage.py以创建名称为application,而不是app的对象

    1
    2
    3
    4
    5
    6
    import os
    from application import create_app, db
    from flask.ext.script import Manager, Shell

    application = create_app(os.getenv('FLASK_CONFIG') or 'default')
    manager = Manager(application)

  • 创建.ebextensions/myapp.config并定义以下块以指向manage.py

    1
    2
    3
    4
    5
    option_settings:
     "aws:elasticbeanstalk:container:python":
        WSGIPath: manage.py
     "aws:elasticbeanstalk:container:python:staticfiles":
       "/static/":"application/static/"
  • 这就让弹性豆茎找到了正确的应用调用。

    这在官方文件中作了简要描述,并在本博客文章中作了更详细的描述。

    编辑-参见下面的项目结构

    • 项目根目录
      • .E扩展
        • application.config(应用程序配置)
      • 应用
        • 主要的
          • 表格.py
          • 视图.py
      • 静止的
      • 模板
      • 测验
      • 管理.py
      • 要求.txt
      • 配置PY
      • 等等,等等


    在EDOCX1[0]中添加以下内容:

    1
    2
    3
    option_settings:
     "aws:elasticbeanstalk:container:python":
        WSGIPath: myApp/handlers/views.py

    更新:

    如果没有.ebextensions目录,请为项目创建一个。您可以在《自定义和配置AWS弹性Beanstalk环境指南》中找到关于容器配置的更多信息。


    从awsebcli 3.0开始,您实际上可以编辑您的配置设置,通过eb config来表示您的WSGI路径。然后,config命令将根据您当前的配置设置拉(并在默认的命令行文本编辑器(即nano)中打开)一个可编辑的配置。然后您将搜索WSGI,并以这种方式更新它的路径。保存文件并退出后,您的WSGI路径将自动更新。


    Your WSGIPath refers to a file that does not exist.

    出现此错误是因为beanstalk在默认情况下查找application.py。检查Beanstack Web UI,Configuration > Software ConfigurationWSGIPath映射到application.py

    WSGIPath is set by default to application.py. Set to manage.py.

    更新WSGIPath,如前一个回复所示,或重命名为application.py文件。


    当我遇到这个问题时,是因为我正在使用GUI上传我的项目文件的压缩包。最初,我正在压缩项目级目录并将该zip上载到eb。

    然后我切换到简单地上载项目文件本身的zip,即选择所有文件并将其发送到一个zip,然后GUI上载实用程序能够找到我的application.py文件而没有问题,因为application.py文件不在子文件夹中。


    wsgi配置对我来说很痛苦。我确实使用eb config命令更改了wsci设置,但它不起作用。下面你可以通过5个简单的步骤来解决这个问题。

    1-将app.py函数移动到目录的根目录(在这里我运行eb init命令)。

    2-也将app.py重命名为application.py,在该初始化应用中,application = Flask(__name__)不是app = Flask(__name__)

    3-eb deploy在这之后(在同一个项目中)没有起作用,我尝试使用eb config来修复config,但是它太毛毛了,无法进行排序。从项目中删除所有.extensions、.gitignore等。

    4-使用eb init重新初始化您在eb上的项目,并按照提示操作。部署完成后,eb open将启动您的webapp(希望!)


    嗯,在我的例子中,我遵循了整个流程和约定,但仍然得到404。问题是我的虚拟环境。我忽略了.gitignore中所有与环境配置相关的文件夹/文件,而不是.ebignore中的文件夹/文件。创建.ebignore并忽略所有与项目代码无关的文件夹/文件后,修复了该问题。