【问题标题】:Your WSGIPath refers to a file that does not exist您的 WSGIPath 引用了一个不存在的文件
【发布时间】:2015-09-19 01:53:54
【问题描述】:

我正在尝试将我的 Flask 应用程序上传到 AWS,但是这样做时收到错误消息:

您的 WSGIPath 引用了一个不存在的文件。

在网上做了一些挖掘后,我发现在 .ebextensions 文件夹中,我应该指定路径。没有 .ebextensions 文件夹,所以我创建了一个并将以下代码添加到名为 settings.config 的文件中:

option_settings:
  "aws:elasticbeanstalk:container:python":
    WSGIPath: project/application.py

WSGIPath 是 application.py 文件的正确路径,所以我不确定是什么引发了这个错误。我是否正确更改了 WSGIPath,是否有更好的方法,或者是否有其他问题导致这种情况发生?谢谢。

【问题讨论】:

    标签: amazon-web-services flask amazon-elastic-beanstalk


    【解决方案1】:

    部署在 AWS 上的 Flask 可能会出现很多配置问题。我遇到了与您类似的问题,因此我至少可以向您展示我为解决 WSGI 错误所做的工作。

    首先,显然您可以在没有 .ebextensions 文件夹的情况下执行此操作(请参阅此帖子 here。并查看 davetw12 的答案。但是,请注意,虽然这有效,但我并不完全确定 davetw12 关于 .ebextensions 的结论是正确的,基于下面的一些 cmets)。相反,(在终端中),我导航到与我的 .elasticbeanstalk 目录处于同一级别的项目并使用命令eb config。这将打开一个选项列表,您可以设置这些选项来配置您的 beanstalk 应用程序。向下浏览选项,直到找到 WSGI 路径。我注意到您将您的设置为project/application.py,但是,这不应该包括文件夹引用,只是application.py。这是它在我的 Mac 终端上的外观(WSGI 路径靠近底部)。

    请注意,一旦您获得该设置,EB 可能会重新部署。没关系。让它。

    设置完成后,进入您的 application.py 文件并确保调用您的应用程序application。例如,我的看起来像这样:

    from flask import Flask
    from flask import render_template
    application = Flask(__name__)
    
    @application.route('/')
    @application.route('/index')
    def index():
        return render_template('index.html',
                               title='Home')
    

    这消除了 WSGI 路径错误 - 尽管在此之后我仍然需要修复一些其他问题 :-) 但这是一组不同的问题。

    【讨论】:

    • 我有一个类似的问题,使用eb config 我发现 WSGIPath 不在我的配置数据中 - 实际上我没有得到 aws:elasticbeanstalk:container:python 的任何信息。我将它设置在一个 .config 文件中,但它似乎被仪表板中保存的配置覆盖 - 在首页上显示 WSGIPath: application.py,但不允许我在任何地方编辑它。看来我只需要创建一个 application.py!
    • 我们遇到了未安装 psycopg2 的问题。将这些行添加到我们的 .ebextensions/01-app.config 文件中修复了它: packages: yum: postgresql93-devel: []
    • 我不同意 davetw12 的回答,即 ebconfig 不再相关 - 请参阅我的评论。你们是在不经意间传播错误信息
    • @HaveAGuess 谢谢。我没有时间对此进行大量研究,所以我只是更新了我的答案,说我发布的内容确实有效,但并不是说 ebextensions 已经过时。这就是我现在所有的时间。
    • 这很奇怪。为什么eb config 显示的值与.ebextensions 内的配置文件中设置的值不同?
    【解决方案2】:

    如果这里有人通过 AWS 控制台 (GUI) 进行操作,请修改配置并将您的脚本名称放入 WSGIPath 中,如下所示。

    如果您是新人,我会提供奖励提示。

    • 您也应该匹配脚本名称和 Flask 对象
    • 常见错误: 压缩源代码时,需要 选择文件并压缩,而不是文件夹。 (确保你有 .py 在 zip 的根目录中)
    from flask import Flask
    application = Flask(__name__)
    
    @application.route("/")
    def hello():
        return "Hello"
    
    if __name__ == "__main__":
        application.run()
    

    【讨论】:

    • 这对我有用,我欠你一杯啤酒?
    • 应该可以修复它,但是每次在弹性 ​​beanstalk 上创建新应用程序时都必须设置它,此解决方案不可移植。似乎问题在于弹性beantalk由于某种原因没有拾取ebextensions配置文件
    【解决方案3】:

    我也有同样的信息,但出于一个非常愚蠢的原因。

    显然,当我将 repo 克隆到我的 Windows PC 然后将更改推回时,Windows 将“.ebextensions”文件夹更改为“ebextensions”(删除前导“.”)。

    因此,当我在主存储库中将文件夹重命名为“.ebextensions”时,一切又开始完美运行。

    【讨论】:

      【解决方案4】:

      对我来说,问题是我拼错了文件名:

      我写了:..ebextensions/django.conf

      当我需要时:..ebextensions/django.config

      今天这花费了我大约 3 个小时的时间。问题是AWS错误具有误导性,因为它引用的“WSGIPath”不是上面的文件,而是一些不可见的默认值。

      【讨论】:

      • 我真的觉得这个错误也有误导性,我已经尝试了大多数我能在网上找到的答案,但仍然没有成功。
      【解决方案5】:

      在我的情况下,尝试许多解决方案并没有解决问题,而是将 WSGIPath

      option_settings:
        "aws:elasticbeanstalk:container:python":
          WSGIPath: project_name/application_name.py
      

      option_settings:
            "aws:elasticbeanstalk:container:python":
              WSGIPath: project_name.wsgi
      

      工作就像一个魅力。这是文件结构:

      ├── manage.py
      ├── mysite ***
      │   ├── __init__.py
      │   ├── settings.py
      │   ├── urls.py
      │   └── wsgi.py ***
      ├── myvenv
      │   └── ...
      └── requirements.txt
      

      【讨论】:

      • 这取决于您使用的平台。如果您使用 Amazon Linux 1,则必须使用 nginx 的斜杠语法,如果您使用的是 Amazon Linux 2,则必须使用 gunicorn 的点语法
      猜你喜欢
      • 2019-03-06
      • 2020-05-04
      • 2016-08-22
      • 2016-12-03
      • 2020-06-22
      • 2016-12-08
      • 2015-06-06
      • 1970-01-01
      • 2018-07-23
      相关资源
      最近更新 更多