cherrypy:如何获取所有活动会话(storage_type =" file")

时间:2014-05-12 21:33:42

标签: session pickle cherrypy

我的目标是在由cherrypy提供支持的网站中跟踪所有登录用户。 会话存储在RAM(tools.sessions.storage_type = "ram")中,我可以通过以下方式获取信息:

  

cherrypy.session.cache.values()

但是会话存储在文件(tools.sessions.storage_type = "file")中,尝试做同样的事情,我得到:

  

AttributeError:'FileSession'对象没有属性'cache'

如何访问存储在会话文件中的信息?

编辑:

Andrew Kloos的提议是从目录加载会话文件(由tools.sessions.storage_path给出),并取消文件的pickle。 这在大多数情况下都有效,但有时,其中一个文件仍然是LOCKED,并且unpickling失败。 另一方面,我无法相信当前会话有一个会话对象(即cherrypy.session),并且其他会话没有可用的对象,并且有义务浏览会话文件...

2 个答案:

答案 0 :(得分:1)

好的查看cherrypy / lib / sessions文件我看到获取会话值会运行此加载函数...

def _load(self, path=None):
    if path is None:
        path = self._get_file_path()
    try:
        f = open(path, "rb")
        try:
            return pickle.load(f)
        finally:
            f.close()
    except (IOError, EOFError):
        return None

所以你只需要模仿它,但也循环遍历会话文件文件夹中的所有会话。尝试这样的事情......

import cherrypy
from cherrypy._cpcompat import pickle
import os

class HelloWorld(object):
    @cherrypy.expose
    def asdf(self):
        # loop through all the files in the sessions folder
        for FileName in os.listdir(os.path.abspath(os.path.dirname('sessions')) + '/sessions'):

            #  **EDIT**
            if(FileName.find('.lock') == -1)
                f = open(os.path.abspath(os.path.dirname('sessions')) + '/sessions/' + FileName, "rb")
                sessiondata = pickle.load(f)
                print(sessiondata[0]['FirstName'])
            #  **EDIT**

        cherrypy.session['FirstName'] = 'adsdf'
        return 'hi'

cherrypy.config.update({
                    'tools.sessions.on' : True,
                    'tools.sessions.storage_type' : 'file',
                    'tools.sessions.storage_path' : 'sessions'
                    })

cherrypy.quickstart(HelloWorld())

希望这有帮助!

答案 1 :(得分:0)

我只会使用python给你一个简单的单线。

    sessions = os.listdir('./tmp/sessions')
    sessions = filter(lambda session: '.lock' not in session, sessions)

首先,列出目录中的会话文件。 然后,您过滤掉锁定文件。