2011-10-09 83 views
1

這可能是一個非常不好的問題,但我想確保我的代碼正在做我認爲正在做的事情。記錄請求後回覆

這就是我所追求的 - 獲取請求,做出決定,對決策做出迴應,然後記錄下來。順序很重要,因爲寫入速度可能很慢,我想確保在發生任何寫入之前發佈響應。

這裏的示例代碼:

class ConferenceGreetingHandler(webapp.RequestHandler): 
def get(self): 
    self.post() 

def post(self): 

    xml_template(self, 'templates/confgreeting.xml') 

    new_log = Log() 
    new_log.log = 'test' 
    new_log.put() 

我想我服測井響應之前,這是實際上是真的嗎?另外,有沒有更好的方法來做到這一點?再次,抱歉超noobishness ...

編輯:這裏是模板:

def xml_template(handler, page, values=None): 
    path = os.path.join(os.path.dirname(__file__), page) 
    handler.response.headers["Content-Type"] = "text/xml" 
    handler.response.out.write(template.render(path, values)) 

回答

3

無論你做什麼,App Engine都不會向用戶發送響應,直到處理程序代碼完成。不幸的是,目前沒有辦法告訴App Engine「現在發送響應,我不會再輸出」。

您有幾種選擇:

  1. 只要把日誌條目同步。數據存儲寫入相對於掛鐘延遲而言並不是非常昂貴,尤其是如果您最小化所需的索引更新數量。
  2. 排隊任務隊列任務以寫入日誌數據。如果使用拉隊列,則可以提取日誌條目並將其從另一個任務或後端批量寫入數據存儲區。
  3. 只要您擁有相關數據,就立即開始數據存儲寫入日誌條目,並使用異步操作,使您可以將寫入與某些處理重疊。
+0

謝謝尼克。我假設我是否想在應用程序引擎之外遵循任務隊列方法,Celery會是一條路嗎? – Sologoub

+0

@Sologoub我不太熟悉芹菜。我建議使用App Engine任務隊列;打電話給外部人只會減慢速度。 –

+0

謝謝,尼克。芹菜是一個開源任務隊列。適用於RabbitMQ。我正在尋找gae的替代品,因爲定價令我有點擔心。比其他任何事都更害怕未知。 – Sologoub

0

這在很大程度上取決於什麼呢xml_template。如果它執行self.response.write(...),那麼處理程序已完成這部分服務響應。一旦你的處理程序正常完成,webapp框架將完成其餘的工作。

我不確定你的「更好的方式」問題是指什麼,但有兩點突出。

首先,logger.warn("test")將寫入系統日誌,而不是創建一個Log實例,您必須(可能)跟蹤並稍後刪除。

其次,如果您打算廣泛使用xml_template,請將其設爲實例方法。創建您自己的webapp.RequestHandler的子類,將xml_template放在那裏,然後爲您的特定處理程序創建子類。

更新:我忽略了在寫入之前想要得到響應的部分。如果您正在忍受緩慢的寫入,請首先仔細查看寫入的實體是否被過度索引(索引在永遠不會被查詢的字段上)。如果這還不足以讓性能達到可接受的範圍,尼克提出的建議就是要走的路。

+0

謝謝戴夫。我添加了xml模板代碼。它正在做handler.response.out.write()。我有兩個 - 一個是爲XML設置標題,另一個是爲HTML設置標題。 – Sologoub