2013-04-16 68 views
3

從文檔http://flask-kvsession.readthedocs.org/en/0.3.1/cleanup_sessions(),它表示應該定期調用此方法來清理過期的會話。如何使用Flask-KVSession管理清理過期的會話?

這是否意味着如果我不清除它,會話內存使用量將在應用程序的生命週期中擴展?

如果我不定期清理它們,有什麼不好的影響?

在應用程序中安排定期清理的一些好方法是什麼?

我可以使用Redis作爲存儲後端並自動設置到期日嗎?

回答

0

您可以使用Redis,但它仍會存儲過期的會話。存儲過期會話的含義是您會浪費磁盤空間或RAM,這對Redis來說尤其糟糕。

至於計劃清理,只需創建一個每日腳本與cron或upstart運行cleanup_sessions。或者,你也可以修改simplekv對鍵設置過期時間:https://github.com/mbr/simplekv/blob/master/simplekv/memory/redisstore.py

+0

我覺得'cleanup_sessions'需要在應用程序的同一個實例中運行?一個Cron運行'cleanup_sessions'本身沒有關於應用程序的上下文知識將工作? – hllau

+2

您可以創建一個運行''cleanup_sessions''的路由並在該路由上運行wget的cron作業。 – imsky

+1

這是一個很好的伎倆。 – hllau

2

如果使用RedisStore,KVSession會選燒瓶配置項PERMANENT_SESSION_LIFETIME和自動完成會話清理。僅適用於不支持TimeToLiveMixin界面的後端,您必須手動完成。

到期會話 會話將失效,導致它們失效。要自動從後端移除,該後端必須支持TimeToLiveMixin接口;支持它的示例後端是RedisStore和MemcacheStore。

當使用不支持生存時間的不同後端時,例如通過FilesystemStore生成平面文件時,可定期調用cleanup_sessions()以刪除未使用的會話。

2

您可以註冊'after_request'或'before_request'來定期處理清理。

from flask import Flask 

from flask.ext.kvsession import KVSessionExtension 
from simplekv.db.sql import SQLAlchemyStore 
from sqlalchemy import create_engine, MetaData 

# init app 
app = Flask(__name__) 

# init Flask-KVSession 
engine = create_engine('mysql+pymysql://user:[email protected]/kvsession_db') 
metadata = MetaData(bind=engine) 
store = SQLAlchemyStore(engine, metadata, 'kvsession_table') 
metadata.create_all() 
kvsession_extension = KVSessionExtension(store, app) 

# perdiocally cleanup expired sessions 
import time 
# do cleanup per day. You may store this value in app.config 
SESSION_CLEANUP_INTERVAL = 60 * 60 * 24 
deadline = None 
@app.after_request 
def cleanup_expired_sessions(): 
    global SESSION_CLEANUP_INTERVAL, deadline 
    if deadline is None: 
     kvsession_extension.cleanup_sessions(app) 
     deadline = time.time() = SESSION_CLEANUP_INTERVAL 
    else: 
     if time.time() >= deadline: 
      # time to do cleanup 
      kvsession_extension.cleanup(app) 
      # update deadline 
      deadline = time.time() + SESSION_CLEANUP_INTERVAL