2008-10-03 31 views
3

我喜欢CherryPy的会话API,除了一个细节。我不想说​​我只想说session["spam"]尽早初始化cherrypy.session

不幸的是,我不能简单地在我的模块中有一个全局的from cherrypy import session,因为cherrypy.session对象直到第一次发出页面请求时才被创建。有没有办法让CherryPy立即初始化其会话对象,而不是第一个页面请求?

我有两个丑陋的选择,如果答案是否定的:

首先,我可以做这样的事情

def import_session(): 
    global session 
    while not hasattr(cherrypy, "session"): 
     sleep(0.1) 
    session = cherrypy.session 

Thread(target=import_session).start() 

这感觉就像一个大的杂牌,但我真的很讨厌写​​每一次,所以对我来说这是值得的。

我的第二个解决办法是做类似

class SessionKludge: 
    def __getitem__(self, name): 
     return cherrypy.session[name] 
    def __setitem__(self, name, val): 
     cherrypy.session[name] = val 

session = SessionKludge() 

但这种感觉就像一个更大的组装机和我需要做更多的工作来实现其他词典功能,如.get

所以我肯定会更喜欢简单的方法来自己初始化对象。有谁知道如何做到这一点?

回答

5

对于CherryPy 3.1,您需要找到Session的正确子类,运行其'setup'类方法,然后将cherrypy.session设置为ThreadLocalProxy。这一切都发生在cherrypy.lib.sessions.init,在以下块:

# Find the storage class and call setup (first time only). 
storage_class = storage_type.title() + 'Session' 
storage_class = globals()[storage_class] 
if not hasattr(cherrypy, "session"): 
    if hasattr(storage_class, "setup"): 
     storage_class.setup(**kwargs) 

# Create cherrypy.session which will proxy to cherrypy.serving.session 
if not hasattr(cherrypy, "session"): 
    cherrypy.session = cherrypy._ThreadLocalProxy('session') 

减少(你想要的子类替换FileSession):

FileSession.setup(**kwargs) 
cherrypy.session = cherrypy._ThreadLocalProxy('session') 

的 “kwargs” 包括“超时“,”clean_freq“以及tools.sessions。* config中的所有子类特定条目。