【问题标题】:Serve Static Pages from S3 using Django使用 Django 从 S3 提供静态页面
【发布时间】:2013-02-20 16:11:48
【问题描述】:

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

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

我如何准确地检索请求的数据(即静态页面)并将其返回给用户?我想在合理的范围内最大限度地减少性能损失,当然如果用户直接从 S3 请求他们的静态页面(我不希望他们这样做)”。

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

非常感谢!

【问题讨论】:

    标签: python django amazon-s3


    【解决方案1】:

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

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

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

    您可以选择指定在 404 的情况下将返回给用户浏览器的 HTML 文档 - 错误文档。您可以创建一个检查当前 URL 的小型 HTML 页面,然后简单地将 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 页面,然后一次用于获取真实页面)。

    另外,您需要调整我上面的代码,以避免在实际 url 不正确的情况下触发 404 循环,方法是添加如下检查:

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

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      您只需在 /static-pages/12345/ 文件夹中创建 index.html 即可。

      【讨论】:

        猜你喜欢
        • 2014-08-22
        • 2023-03-25
        • 1970-01-01
        • 2023-03-13
        • 2012-10-29
        • 2021-07-07
        • 2019-11-14
        • 2014-11-12
        • 1970-01-01
        相关资源
        最近更新 更多