cherrypy.lib.sessions模块¶
Cherrypy的会话实现。
您需要编辑配置文件才能使用会话。举个例子:
[/]
tools.sessions.on = True
tools.sessions.storage_class = cherrypy.lib.sessions.FileSession
tools.sessions.storage_path = "/home/site/sessions"
tools.sessions.timeout = 60
这会将会话设置为存储在目录/home/site/sessions中的文件中,并将会话超时设置为60分钟。如果你忽略了 storage_class
,会话将保存在RAM中。 tools.sessions.on
是工作会话的唯一必需行,其余是可选的。
默认情况下,会话ID在cookie中传递,因此客户端的浏览器必须为您的站点启用cookie。
要为当前会话设置数据,请使用 cherrypy.session['fieldname'] = 'fieldvalue'
;获取数据使用 cherrypy.session.get('fieldname')
.
锁定会话¶
默认情况下, 'locking'
会话模式为 'implicit'
,这意味着会话被提前锁定和延迟解锁。对于处理时间较长的任何请求(流式响应、昂贵的计算、数据库查找、API调用等),请注意此默认模式,因为其他同时使用会话的请求将挂起,直到会话解锁。
如果要控制会话数据锁定和解锁的时间,请设置 tools.sessions.locking = 'explicit'
.然后打电话 cherrypy.session.acquire_lock()
和 cherrypy.session.release_lock()
.无论您使用哪种模式,当请求完成时,会话都将被保证解锁。
过期会话¶
您可以强制会话过期 cherrypy.lib.sessions.expire()
.只需在您希望会话过期时调用该函数,它将导致会话cookie在客户端过期。
会话固定保护¶
如果Cherrypy通过请求cookie接收到它无法识别的会话ID,那么它将拒绝该ID并创建一个新的ID以返回到响应cookie中。这个 helps prevent session fixation attacks .但是,Cherrypy通过查找保存的会话数据来“识别”会话ID。因此,如果从未保存任何会话数据, 您将获得每个请求的新会话ID .
CherryPy覆盖未识别的会话ID的副作用是,如果在单个域(例如,在不同端口上)上运行多个单独的CherryPy应用程序,则每个应用程序都将覆盖另一个应用程序的会话ID,因为默认情况下,它们使用相同的cookie名称 ("session_id"
)但不要互相承认。因此,最好对每个名称使用不同的名称,例如:
[/]
...
tools.sessions.name = "my_app_session_id"
有效期¶
响应cookie将具有一个到期日期,用于通知客户机何时停止在请求中发送cookie。如果服务器时间和客户机时间不同,则预期会话不可靠。 确保服务器的系统时间是准确的 .
Cherrypy默认为60分钟的会话超时,这也适用于发送到客户机的cookie。不幸的是,有些版本的Safari(至少在Windows XP上是“4公测版”)在分析格林威治标准时间到期日期时出现了一个错误——它们似乎将该日期解释为过去的一个小时。60分钟减去1小时非常接近于零,因此您可能会将此错误作为每个请求的新会话ID,除非请求之间的间隔小于1秒。要修复,请尝试增加session.timeout。
另一个极端是,一些用户报告Firefox在到期日后发送cookie,尽管这是在系统时间不准确的系统上。也许FF不信任系统时间。
- class cherrypy.lib.sessions.FileSession(id=None, **kwargs)[源代码]¶
基类:
cherrypy.lib.sessions.Session
为会话实现文件后端
- storage_path
将保存会话数据的文件夹。每个会话将在其自己的文件中保存为pickle.dump(数据、过期时间);文件名为self.sessionu prefix+self.id。
- lock_timeout
时间增量或数字秒,指示阻止获取锁的时间。如果没有(默认),获取锁将无限期阻塞。
- LOCK_SUFFIX = '.lock'¶
- SESSION_PREFIX = 'session-'¶
- pickle_protocol = 4¶
- class cherrypy.lib.sessions.MemcachedSession(id=None, **kwargs)[源代码]¶
基类:
cherrypy.lib.sessions.Session
- locks = {}¶
- mc_lock = <unlocked _thread.RLock object owner=0 count=0>¶
- servers = ['localhost:11211']¶
- class cherrypy.lib.sessions.RamSession(id=None, **kwargs)[源代码]¶
基类:
cherrypy.lib.sessions.Session
- cache = {}¶
- locks = {}¶
- class cherrypy.lib.sessions.Session(id=None, **kwargs)[源代码]¶
基类:
object
一个类似cherrypy dict的会话对象(每个请求一个)。
- _id = None¶
- clean_freq = 5¶
过期会话清理的轮询速率(分钟)。
- clean_thread = None¶
调用self.cleanu的类级监视器。
- debug = False¶
如果为真,则记录调试信息。
- property id¶
返回当前会话ID。
- id_observers = None¶
要传递新ID的回调列表。
- loaded = False¶
如果为真,则数据已从存储中检索。这应该在第一次尝试访问会话数据时自动发生。
- locked = False¶
如果为true,则此会话实例对会话数据具有独占的读/写访问权限。
- missing = False¶
如果客户端请求的会话不存在,则为true。
- originalid = None¶
客户端传递的会话ID。可能丢失或不安全。
- regenerated = False¶
如果应用程序调用了session.regent(),则为true。这不是由内部调用设置以重新生成会话ID。
- timeout = 60¶
删除会话数据的分钟数。
- cherrypy.lib.sessions._add_MSIE_max_age_workaround(cookie, timeout)[源代码]¶
我们希望使用http://www.faqs.org/rfcs/rfc2109.html中指示的“最大年龄”参数,但IE不会将其保存到磁盘,如果用户关闭浏览器,会话就会丢失。所以我们不得不用旧的“过期”..。叹息..。
- cherrypy.lib.sessions.init(storage_type=None, path=None, path_header=None, name='session_id', timeout=60, domain=None, secure=False, clean_freq=5, persistent=True, httponly=False, debug=False, **kwargs)[源代码]¶
初始化会话对象(使用cookie)。
- storage_class
要使用的会话子类。默认为ramsession。
- storage_type
(已弃用)“ram”、“file”、“memcached”之一。这将用于在cherrypy.lib.sessions globals中查找相应的类。例如,“file”将使用filesession类。
- 路径
要插入响应cookie元数据的“path”值。
- path_header
如果“path”为“none”(默认),则将从request.headers中提取响应cookie“path”。 [path_header] .
- 名称
cookie的名称。
- 超时
存储的会话数据的过期超时(分钟)。如果“persistent”为true(默认值),则这也是cookie的超时。
- 域
cookie域。
- 保护
如果为false(默认值),则不会设置cookie的“secure”值。如果为true,则cookie的“secure”值将设置为(1)。
- 清洁频率(分钟)
过期会话清理的轮询速率。
- 持久的
如果为true(默认值),则将使用“timeout”参数使cookie过期。如果为false,则cookie将没有过期,cookie将是一个“会话cookie”,在浏览器关闭时过期。
- 仅限HTTPOnly
如果为false(默认值),则不会设置cookie“httponly”值。如果为真,则cookie“httponly”值将设置为(1)。
任何附加的Kwarg都将绑定到新会话实例,并且可能特定于存储类型。有关详细信息,请参阅正在使用的会话的子类。
- cherrypy.lib.sessions.set_response_cookie(path=None, path_header=None, name='session_id', timeout=60, domain=None, secure=False, httponly=False)[源代码]¶
为客户端设置响应cookie。
- 路径
要插入响应cookie元数据的“path”值。
- path_header
如果“path”为“none”(默认),则将从request.headers中提取响应cookie“path”。 [path_header] .
- 名称
cookie的名称。
- 超时
cookie的过期超时。如果0或其他布尔值为false,则不会设置“expires”参数,cookie将是一个“会话cookie”,在浏览器关闭时过期。
- 域
cookie域。
- 保护
如果为false(默认值),则不会设置cookie的“secure”值。如果为true,则cookie的“secure”值将设置为(1)。
- 仅限HTTPOnly
如果为false(默认值),则不会设置cookie“httponly”值。如果为真,则cookie“httponly”值将设置为(1)。