2014-11-20 40 views
0

問題與標題中所述的一樣。但是,這個原因對於一個好的答案可能很重要。如何在運行時在python應用程序引擎上創建文件:live或localhost

我需要在運行時生成靜態html文件。生成文件不是問題。使用jinja2webapp2我可以在運行時無痛地生成動態html文件並將其提供給我的用戶。我的問題是生成這些文件是昂貴的。所以我想能夠將它們保存爲靜態html文件;所以,當用戶試圖訪問它們時,我只是提供靜態HTML,如果它存在。如果它不存在,那麼我可以創建該文件並將其提供。

我再次使用jinja2來創建我的字符串(即文件內容)。所以我的問題是,如何將文件保存到我的app.yaml文件可以映射到的路徑?

此外,如果你在想memcache我已經在使用它。這是不夠的存儲。所以雖然它是一個緩衝區,但不如具有靜態html文件。

一些背後的故事:

如果我可以生成本地主機中的文件,那將會更好。事情是這個網站有很多頁面。但是結構對所有頁面都是通用的。因此,我們將相關數據存儲在datastore中,並使用jinja2來誇大不同的頁面。但由於使用量過大,memcache無法跟上。所以現在看起來更具成本效益,可以通過存儲在datastore中的數據創建靜態html頁面。手工創建這些頁面是容易出錯和容易出錯的。因此,如果我們可以像往常一樣生成HTML頁面(即jinja2模板和數據存儲),然後有用於創建html頁面的自動化系統,那將非常棒。我們可以手動執行app.yaml部件。

我這樣做後

template = jinja_environment.get_template(‘template.html') 
content = template.render(template_values) 

我該怎麼辦,將文件保存說./relevant/path/filename.html

+0

在本地生成它們。然後上傳爲靜態html。你可以採取幾種不同的方法。 – 2014-11-23 11:46:53

回答

0

你不能寫在App Engine中的文件 - 見https://cloud.google.com/appengine/kb/java?csw=1#writefile的說明。

爲什麼不將渲染後的頁面內容存回數據存儲?我假設您現在使用的方法中「昂貴」的部分是從數據構建模板化內容。一旦你完成了這些工作,而不是把它寫到本地文件中,你可以把它作爲原始數據實體的附加屬性,或者你可以爲渲染的頁面創建一個全新的模型。

從本質上講,如果問題是頁面被從memcache中過度驅逐,這將是一個持久的數據存儲實現而不是memcache。

單個提取(直接從鍵,因爲您可以使用您可以基於您提取的頁面創建的鍵名,所以您不必甚至執行查詢)是輕量級的。然後,如果您仍在使用memcache,那麼您首先會檢查memcache;如果不存在,則從數據存儲中獲取實體並檢查呈現的屬性是否包含數據。如果沒有,則使用實體中的數據用Jinja渲染它,將其存儲在渲染的屬性中,放入實體,將其存儲在memcache中,然後將渲染的內容返回給客戶端。

+0

謝謝。這是一個好主意。但之前我拒絕的原因是數據存儲的介入。我始終明白,靜態文件比數據存儲訪問便宜很多;甚至是基於密鑰的訪問。通過昂貴我的意思是$$錢。基於密鑰的訪問會更便宜嗎?我會再看看價格。謝謝。 – 2014-11-20 19:53:39

+0

現在我正在使用自動生成的ID。我可以將其更改爲現有實體的名稱而不會丟失任何數據嗎?我不記得。 – 2014-11-20 19:58:26

+0

是的,靜態文件很便宜,但不能以編程方式創建/編輯 - 所以這是不可行的。你知道你在memcache上得到什麼類型的錯過率嗎?任何想法有多少錯失是由於驅逐而沒有被渲染?如果在memcache上獲得80%以上的命中率,然後在渲染的數據存儲實體上獲得80 +%的命中率,則只剩下<4%,導致整個頁面生成。根據頁面大小和數據更改的頻率,您也可以探索GCS,但可能沒有實質性差異。 – Mike 2014-11-20 22:15:43

2

如果我正確理解您的問題,最好的方法是將您的靜態文件存儲在Google Cloud Storage(GCS)中。易於讀取和寫入GCS。當你不再需要時很容易刪除文件。

相關問題