2013-03-06 54 views
2

我打算構建一個Django應用程序來生成以後的服務器靜態頁面(可能存儲在S3上)。當用戶訪問像mysite.com/static-pages/12345這樣的url時,我的S3存儲桶中名爲12345.html的靜態文件應該被提供。例如,該靜態文件可能是我的網站爲用戶生成的博客頁面的靜態HTML頁面。使用Django從S3服務靜態頁面

這是包括像被渲染爲Django模板,因爲我已經知道如何使用Django模板和SQL數據庫頁面上的CSS/JavaScript文件的靜態資源不同 - 什麼是陌生的對我來說,我的「數據「現在是S3上的文件,而不是數據庫中的條目,而且我實際上並不需要使用模板。

我該如何檢索請求的數據(即靜態頁面)並將其返回給用戶?我想在合理的範圍內儘量減少性能損失,當然如果用戶直接從S3請求他們的靜態頁面(我不希望他們這樣做),它當然是最快的。「

還有一些問題: 我讀過其他地方有關django flatpages應用程序,它將html頁面存儲在數據庫中,但似乎靜態html頁面最好存儲在像S3這樣的文件系統上,不是嗎? 有沒有辦法讓請求進入我的Django應用程序,並讓S3直接服務於文件,使它看起來來自我的應用程序(即瀏覽器url仍然說mysite.com/static-pages/12345,但該頁面沒有通過我的Django服務器)?

謝謝v很多!

回答

0

Amazon S3不支持URL重寫(它不是網絡服務器),因此您將別無選擇,只能將請求代理到可以爲您重寫網址的Web服務器或服務。

您可以使用您控制的網絡服務器並按照instructions here的說法讓Apache重寫網址,但當整個網站加載靜態網站時,這似乎有點浪費。

另外,我有一個解決方案,如果你想在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; 
} 

希望有所幫助。

0

您可以在/ static-pages/12345 /文件夾中創建index.html並將其提供。