静态资产不会出现在弹性豆茎上的烧瓶上

时间:2013-02-25 22:11:20

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

你如何获得aws弹性beanstalk来识别你的烧瓶应用程序中的静态资产?我做了标准的/.ebextensions/python.config几个YAML行a la:

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

9 个答案:

答案 0 :(得分:6)

我不确定你放置静态文件的位置,但由于我的通常位于app/static,我有:

[aws:elasticbeanstalk:container:python:staticfiles]
/static/=app/static/
/favicon.ico=app/static/favicon.ico

[aws:elasticbeanstalk:container:python]
StaticFiles=/static/=app/static/,/favicon.ico=app/static/favicon.ico

这两个部分似乎都很重要。 (后一部分也有其他内容,但我已经把它留了出来。)我实际上有两个资源路径,/static/目录和顶级/favicon.ico文件,这些文件使旧浏览器变得愚蠢总是要求。

答案 1 :(得分:5)

也可以通过Elastic Beanstalk Panel完成:

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

然后

enter image description here

作为替代选择

答案 2 :(得分:3)

在撰写本文时,在花了几个小时与AWS EB的配置进行斗争后,我放弃了尝试使静态文件按照我们所期望的方式工作并将我的Flask应用创建更新为:

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

这会呈现/s/scripts/my-script.js之类的网址,因为我总是在我的代码和模板中使用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文件。

答案 3 :(得分:1)

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时,它工作正常。

&lt; sarcasm&gt; Elastic Beanstalk非常直接且记录良好!&lt; / sarcasm&gt;

答案 4 :(得分:1)

我花了很多时间试图找出答案并整理这些建议。我对2020年仍然有用的答案发表了评论。这是我遇到的解决方案的TL; DR:

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

Read more here.

答案 5 :(得分:0)

我遇到了类似的问题,奇怪的是,来自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/之后的任何路径

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

这个问题使我有些困惑,因为它在本地工作。无需更改配置。我在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周围的引号。

答案 8 :(得分:0)

我尝试了迈尔斯·贝克(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