尽早初始化cherrypy.session
时间:2020-03-06 15:05:21 来源:igfitidea点击:
除了一个细节外,我喜欢CherryPy的会话API。我不想说cherrypy.session [" spam"]
,而只是说session [" spam"]
。
不幸的是,我不能在我的一个模块中简单地拥有一个全局的"来自cherrypy导入会话",因为直到第一次发出页面请求时才创建" cherrypy.session"对象。有什么方法可以让CherryPy立即初始化其会话对象,而不是在第一页请求上初始化它?
如果答案是否定的,我有两个丑陋的选择:
首先,我可以做这样的事情
def import_session(): global session while not hasattr(cherrypy, "session"): sleep(0.1) session = cherrypy.session Thread(target=import_session).start()
这似乎是个大麻烦,但是我真的很讨厌每次都写cherrypy.session [" spam"]
,所以对我来说这是值得的。
我的第二个解决方案是做类似的事情
class SessionKludge: def __getitem__(self, name): return cherrypy.session[name] def __setitem__(self, name, val): cherrypy.session[name] = val session = SessionKludge()
但这感觉就像一个更大的麻烦,我需要做更多的工作来实现其他字典功能,例如.get。
因此,我绝对希望自己使用一种简单的方法来初始化对象。有谁知道如何做到这一点?
解决方案
对于CherryPy 3.1,我们需要找到正确的Session子类,运行其"设置"类方法,然后将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"由" timeout"," clean_freq"以及tools.sessions。* config中任何特定于子类的条目组成。