2013-11-21 44 views
0

我有一個在Heroku上運行的非常非常簡單的Flask應用程序。它所做的只是偵聽HTTP POST請求,並在獲得正確格式的請求時發送電子郵件。在Heroku的Flask應用程序中存儲值的最簡單方法是什麼?

有時應用程序會在幾分鐘內收到幾個請求。發生這種情況時,我並不特別想爲每個請求發送一封電子郵件。

我希望能夠在發送電子郵件以響應請求時存儲時間戳,然後在隨後的請求中讀取該時間戳以避免發送電子郵件,例如一個小時。

看來我需要在Heroku中使用一些存儲插件,但是對於這個簡單的任務來說,所有的選項似乎都是完全矯枉過正的。有沒有簡單的方法來存儲此時間戳,以便後續請求可用?

+0

從編程的角度來看最簡單嗎?最初編碼有多難?支持它的代碼有多難?或者從行政支持的角度來看?確保其運行有多難(如果「它」實際上是「運行」的)?備份/恢復數據庫有多難?我們不可能在這裏給你一個「正確的」答案。 –

回答

1

您需要將發送到數據庫或文件中的最後一封電子郵件的時間戳的值存儲在某處。但是,Heroku使用read-only file system。有一個可以寫入的臨時文件系統,但其中的文件不會超過單個Web請求,所以這會排除持久性存儲。

您有幾種選擇:

  1. 註冊一個Postgresql database(免費Hobby Dev計劃10K行數據,你需要1)
  2. 註冊爲ClearDB(免費的Ignite Plan,高達5MB數據) 。
  3. 註冊MongoHQ(在MongoHQ Sandbox plan上免費,最高可達250MB的數據)。
  4. 可能使用外部服務,如Amazon's S3,將最後一封電子郵件的時間戳存儲在文本文件中。但是,您將爲此承擔更多的傳入和傳出帶寬。

就個人而言,我會去選擇3,但情況因人而異...

0

如果你只有一個客戶端應用程序和客戶端可以接受Cookie,然後存儲的值和召回的最簡單方法它稍後將它寫入用戶會話。

例如:

from flask import session 

@app.route('/api', methods = ['POST']) 
def handle_post(): 
    last_email_timestamp = session.get('last_email_timestamp') 
    now = datetime.utcnow() 
    if last_email_timestamp is None or 
      now - last_email_timestamp > timedelta(hours = 1): 
     # send email 
     session['last_email_timestamp'] = now 

不要忘記,你需要兩個條件,這個工作:

  • 只有一個客戶(因爲每個客戶都有自己的會話存儲)
  • 客戶必須支持cookies(Flask將用戶會話作爲安全cookie寫入)
0

Redis is by遠非最簡單的選擇。首先安裝它(免費):

$ heroku addons:add redistogo:nano 

然後在你的代碼:

import redis 

redis.set('last_timestamp', 1234); 
last_timestamp = redis.get('last_timestamp;) 

注意,納米計劃不包括永久存儲,所以在遠程情況下,服務器宕機,你應該計劃現在收到任何價值。

相關問題