【问题标题】:Static assets don't show up for flask on elastic beanstalk弹性豆茎上的烧瓶不显示静态资产
【发布时间】:2013-02-11 05:13:22
【问题描述】:

如何让 aws elastic beanstalk 识别您的烧瓶应用程序中的静态资产?我做了标准的 /.ebextensions/python.config 一对 YAML 行:

option_settings:
  "aws:elasticbeanstalk:container:python:staticfiles":
    "/static/": "static/"

我对模板中资产的所有调用都包含在“{{url_for('static', filename='img/office.jpg')}}”类型的东西中。

但是页面加载时没有图像、样式或 javascript 显示。这是一个示例日志文件 404。 IP - - [25/Feb/2013:21:48:13 +0000] "GET /static/css/bootstrap.css HTTP/1.1" 404 328 "http://xyz.elasticbeanstalk.com/"

我是否遗漏了一些明显的东西?一切都在我的本地运行良好,只是静态资产一旦我 git aws.push 就不会加载

【问题讨论】:

  • 我也有同样的问题,除了瓶子。我在 /static 中有一堆子文件夹,所以在瓶中我有一条路线说 @route('/static/:path#.+#') 并且它工作正常,但我无法让它在 beanstalk 中工作。希望有人为我们解答!

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


【解决方案1】:

在撰写本文时,在与 AWS EB 的配置进行了数小时的斗争后,我放弃了尝试让静态文件按我们预期的方式工作,并将我的 Flask 应用程序创建更新为:

app = Flask(__name__, static_url_path='/s')

这会呈现像 /s/scripts/my-script.js 这样的 url,因为我总是在我的代码和模板中使用 url_for('static', ...),所以一切都在 AWS 之外继续工作。

2013 年 9 月 30 日更新:我几乎可以保证在 AWS EB 的 Python 容器中完全忽略 staticFiles 设置。

我上面建议的更改具有通过 Flask 路由所有静态文件请求的不良缺点(更准确地说,可能是 WSGI。)不过,这并不难解决。

在您的项目根目录下创建一个名为 app-httpd.conf 的 Apache conig 文件:

Alias /s /opt/python/current/app/static
<Directory /opt/python/current/app/static>
Order allow,deny
Allow from all
</Directory>

此配置告诉 Apache 接管以 /s 开头的任何 URL 请求,与我们为静态文件选择的前缀相同,并从我们应用的 static 文件夹中提供文件。

.ebextensions/custom-apache.config 处创建此文件:

container_commands:
  add_apache_conf:
    command: "cp app-httpd.conf /etc/httpd/conf.d"

此文件将在应用部署期间使用,并将新的 .config 文件复制到配置 Apache 以加载它看到的所有 .config 文件的目录。

【讨论】:

  • 据我了解,.elasticbeanstalk 目录保留了您项目的本地设置。这些设置由eb 命令行工具使用,包括在您运行git aws.push 时。我个人停止使用这些工具,并使用他们的 API 编写了自己的脚本。就我而言,对于 Python,我使用 Boto 包。 .ebextensions 中的内容在部署或更新时包含在您的应用中。它包含部署时将在您的应用服务器中执行的设置或命令。
  • @sergiopereira 谢谢,您对staticfiles 设置问题的评论帮助我解决了我的问题。
【解决方案2】:

我遇到了类似的问题,奇怪的是,static/img/ 中的所有文件都被提供,但 static/css/static/js/ 中的任何文件都没有被提供。

为了解决这个问题,我从 Flask 源的根目录打开了.elasticbeanstalk/optionsettings.app-env,并将这段代码编辑为

[aws:elasticbeanstalk:container:python]
NumProcesses=1
NumThreads=15
StaticFiles=/static/.*=
WSGIPath=application.py

[aws:elasticbeanstalk:container:python:staticfiles]

注意StaticFiles实际上是一个正则表达式,所以在/static/.*.*允许/static/之后的任何路径

【解决方案3】:

我发现解决这个问题的一个奇怪的事情是编辑我的 .gitignore 文件。它包括删除 /dist 文件夹,其中包括我的 CSS 生成到的 dist 文件夹。因此,当我部署时,css 文件实际上丢失了。

希望这可以帮助任何可能在同一条船上的人。

【讨论】:

    【解决方案4】:

    4 年多后,我可以使用以下方法使静态文件正常工作:

    (文件:.ebextensions/WHATEVER_NAME.config

    option_settings:
      - namespace: aws:elasticbeanstalk:container:python
        option_name: StaticFiles
        value: /static/=PATH/FROM/MY/APP/BASE/DIR/TO/STATIC/DIR/
    

    ...在我的情况下,这是

        value: /static/=distrib/static/
    

    我发现改变了我的

    app = Flask(__name__)
    

    app = Flask(__name__, static_url_path='/static')
    

    既不是必要的,也不是充分的。当我只设置 static_url_path 而不是 StaticFiles 时,它不起作用;当我设置 StaticFiles 而不是 static_url_path 时,它工作正常。

    Elastic Beanstalk 非常简单明了,并且有据可查!

    【讨论】:

    • 我需要阅读这个答案几次才有意义,但这是正确的答案。正如@sergiopereira 所说,“AWS EB 的 Python 容器中完全忽略了静态文件设置。”
    【解决方案5】:

    也可以通过 Elastic Beanstalk 面板完成:

    配置 -> 软件配置 -> 静态文件

    然后

    只是作为替代选择

    【讨论】:

    • 这不起作用。它设置了 Flask 无法识别的属性aws:elasticbeanstalk:container:python:staticfiles。您需要在aws:elasticbeanstalk:container:python 范围内手动创建一个变量。
    • 嗨@MylesBaker,也许有新的更新,但我向你保证确实如此。该配置目前正在用于我在 Elastic Beanstalk 中的 Flask 和 Node 部署
    • 我可以确认这在 2020 年 4 月有效。我尝试按照其他解决方案的建议手动配置我的 .ebextensions/helloworld.config 文件,但这只会产生额外的问题。 docs.aws.amazon.com/elasticbeanstalk/latest/dg/… 似乎也暗示在控制台中建立的属性会覆盖在配置文件中建立的属性。如果您遇到问题,请考虑先尝试此解决方案! (不像我)
    【解决方案6】:

    这个问题让我有点困惑,因为它在本地工作。无需更改配置。我在我的 html 文件中将第 1 行更改为第 2 行,它工作正常。将静态文件夹保存在根目录中,并将配置保存在 /static/:/static/ 中。

     1 <link rel="stylesheet" href={{url_for('static',filename='style.css')}}/>
    
    2 <link rel= "stylesheet" type= "text/css" href= "{{ url_for('static',filename='style.css') }}">
    

    可能是href 周围的引号。

    【讨论】:

      【解决方案7】:

      我花了很多时间试图弄清楚这一点并整理这些建议。我已经对 2020 年仍然相关的答案进行了 cmets。这是我遇到的解决方案的 TL;DR:

      • Elastic Beanstalk UI 上Configuration 左侧导航窗格下Modify Software 屏幕中的static files 部分设置属性aws:elasticbeanstalk:container:python:staticfiles。此配置不会映射到 Flask 需要查找静态资产的 static_url_path
      • 要设置的正确属性是StaticFiles,可以通过将.config 文件添加到.ebextensions 目录来设置。

      Read more here.

      【讨论】:

        【解决方案8】:

        我尝试了 Myles Baker 的解决方案,但没有工作,因为在部署时我收到了错误 -

        ERROR   Invalid option specification (Namespace: 'aws:elasticbeanstalk:container:python', OptionName: 'StaticFiles')
        

        我最终在 .ebextensions/WHATEVER_NAME.config 中使用了以下代码 -

        option_settings:
          aws:elasticbeanstalk:environment:proxy:staticfiles:
            /html: statichtml
            /images: staticimages
        

        从这里直接复制/粘贴 - https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environment-cfg-staticfiles.html

        【讨论】:

          猜你喜欢
          • 2013-04-23
          • 2021-01-21
          • 2016-01-13
          • 2015-04-02
          • 2013-05-25
          • 2020-10-04
          • 2020-08-31
          • 2013-07-06
          • 2019-04-21
          相关资源
          最近更新 更多