无法在弹性豆茎上加载带有瓶子的静态文件

Posted

技术标签:

【中文标题】无法在弹性豆茎上加载带有瓶子的静态文件【英文标题】:Can't load static files with bottle on elastic beanstalk 【发布时间】:2013-04-23 19:05:08 【问题描述】:

在some help 之后,我的瓶子应用程序使用 Elastic Beanstalk 运行。几乎 - 我仍然看不到任何静态文件。我已经按照here 的说明在 .ebextensions 目录中插入了一个名为 python.conf 的文件,其中包含以下内容:

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

不幸的是,这没有奏效。我的文件位于 /static 下的文件夹中(例如,/static/js、/static/css 等)。在我的瓶子应用程序中,我根据答案here 提供静态文件,如下所示:

@route('/static/:path#.+#')
def server_static(path):
    return static_file(path, root='./static')

当我在本地运行它时一切正常。有谁知道我做错了什么?我应该遵循不同的程序,因为我的静态文件位于子文件夹中,还是因为我使用的是瓶子而不是烧瓶?我知道a similar question 在这里被问到烧瓶,但没有答案(据我所知,这可能是一个完全不同的问题)。 非常感谢,亚历克斯

【问题讨论】:

只是猜测,但您是否尝试过在root='./static' 中使用绝对路径而不是相对路径? 嗯,我没有。老实说,我什至不确定实例上的静态路径是什么,它显然与我的本地副本不同。解决方案是在 S3 上托管静态文件吗?我可以为每个项目使用唯一的 url 吗?我想我必须返回所有 html 并将其切换到 S3 地址,但这不会那么困难。 【参考方案1】:

我确信这不是最优雅的解决方案,但我通过将我所有的静态文件放在一个 S3 存储桶中并在我的所有页面中使用它来解决这个问题。

我一开始并没有那么多静态文件,所以这没什么大不了的。我刚刚做了一个 S3 存储桶 url 的变量:

S3Static = r'mystaticbucket.s3-us-west-2.amazonaws.com'

将它传递给我的瓶子模板,并将链接更改为:

<link rel="stylesheet" type="text/css" href = "/static/css/MarmoStyle.css" >

<link rel="stylesheet" type="text/css" href = "S3Static/static/css/Style.css">

(即在路径前添加 S3Static) 如果您像我一样在单独的 %included 标头模板中使用静态文件,则必须将 S3Static 变量传递给模板,如下所示:

%include header.tpl S3Static=S3Static

就是这样。我知道这对每个人来说都不是一个理想的解决方案,并且可能有更好的方法来做到这一点,但到目前为止它对我有用。 谢谢, 亚历克斯

【讨论】:

【参考方案2】:

你真的应该研究一下 python 的 whitenoise 模块。然后,您只需更改一行,并且 URL 路由由瓶子旁边的 whitenoise 处理。本质上,您可以保持 url 与您的域相同,即使 whitenoise 是从其他地方提取的。另外,它旨在缓存您的静态数据。绝对应该使用它。设置大约需要 3 行,您可以删除瓶子的静态文件夹路由。

【讨论】:

以上是关于无法在弹性豆茎上加载带有瓶子的静态文件的主要内容,如果未能解决你的问题,请参考以下文章

如何让 phantomjs 安装在弹性豆茎上?

AWS 弹性豆茎上的 CORS

如何在弹性豆茎上强制 https?

在弹性豆茎上设置 https 代理

在弹性豆茎中设置静态文件

弹性豆茎上的 mod_cloudflare