Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Django从S3提供静态页面_Python_Django_Amazon S3 - Fatal编程技术网

Python 使用Django从S3提供静态页面

Python 使用Django从S3提供静态页面,python,django,amazon-s3,Python,Django,Amazon S3,我计划构建一个Django应用程序来生成和更新服务器静态页面(可能存储在S3上)。当用户访问像mysite.com/static-pages/12345这样的url时,我的S3 bucket中名为12345.html的静态文件应该被提供。例如,该静态文件可能是我的站点为用户生成的博客页面的静态html页面 这与在呈现为Django模板的页面上包含静态资源(如CSS/Javascript文件)不同,因为我已经知道如何使用Django模板和SQL数据库——我不熟悉的是,我的“数据”现在是S3上的文件

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

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

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

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


非常感谢!

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

您可以使用您控制并遵循的web服务器让apache重写URL,但当整个过程都加载静态网站时,这似乎有些浪费

或者,如果您想完全停留在S3中,我有一个解决方案可能会起作用:

您可以选择指定一个HTML文档,在404-错误文档的情况下,该文档将返回到用户浏览器。您可以创建一个小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>

希望对您有所帮助。

您只需在/static pages/12345/文件夹中创建index.html,即可获得服务

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