使用Django从S3提供静态页面

时间:2013-03-06 02:07:39

标签: python django amazon-s3

我打算构建一个Django应用程序来生成服务器静态页面(可能存储在S3上)。当用户访问mysite.com/static-pages/12345等网址时,应该提供名为12345.html的S3存储桶中的静态文件。例如,该静态文件可能是我的网站为用户生成的博客页面的静态html页面。

由于我已经知道如何使用Django模板和SQL数据库,所以不同在包含呈现为Django模板的页面上包含CSS / Javascript文件等静态资源 - 我不熟悉的是我的“数据”现在是S3上的文件,而不是数据库中的条目,我实际上并不需要使用模板。

我究竟如何检索所请求的数据(即静态页面)并将其返回给用户?我希望在合理范围内尽量减少性能损失,但当然如果最快的话用户直接从S3请求他们的静态页面(我不希望他们这样做)“。

还有一些问题: 我在其他地方读到了一个django flatpages应用程序,它将html页面存储在数据库中,但似乎静态html页面最好存储在像S3这样的文件系统上,不是吗? 有没有办法让请求进入我的Django应用程序并让S3直接提供文件,同时使它看起来来自我的应用程序(即浏览器网址仍然是mysite.com/static-pages/12345,但是页面没有通过我的Django服务器)?

非常感谢!

2 个答案:

答案 0 :(得分:0)

Amazon S3不支持URL重写(它不是网络服务器),因此您将别无选择,只能将请求代理到可以为您重写网址的网络服务器或服务。

您可以使用您控制的Web服务器并按照instructions here让apache重写URL,但是当整点加载静态网站时,这似乎有些浪费。

或者,如果您想要完全保留在S3中,我有一个可能有效的解决方案:

您可以选择指定在404的情况下将返回给用户浏览器的HTML文档 - 错误文档。您可以创建一个小的HTML页面,检查当前的URL,然后只需将window.location更改为“重写”的URL,而不使用.html扩展名:

<html>
<script>
    var slash = window.location.lastIndexOf("/");
    var dot = window.location.lastIndexOf(".");

    if (slash < dot) && (dot != -1) {
        window.location = window.location + ".html";
    }
</script>
</html>

显然你想让它更强大,但你明白了。

缺点是每个使用url的静态页面请求都会从用户的浏览器到服务器进行额外的往返(一次用于404页面,然后一次用于获取真实页面)。

此外,您需要调整我的上述代码,以避免在实际网址错误的情况下触发404循环,方法是添加以下内容:

var loopcheck = window.location.IndexOf(".html");
if (lookcheck != -1) {
    window.location = "real404.html";
    return;
}

希望有所帮助。

答案 1 :(得分:0)

你可以在/ static-pages / 12345 /文件夹中创建index.html,它将被提供。