其他分享
首页 > 其他分享> > 早期初始化cherrypy.session

早期初始化cherrypy.session

作者:互联网

除了一个细节外,我喜欢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中任何特定于子类的条目组成.

标签:cherrypy,python
来源: https://codeday.me/bug/20191024/1922053.html