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"

共享会话

如果运行多个CherryPy实例(例如通过Apache预处理后面的mod_python),则很可能无法使用RAM会话后端,因为CherryPy的每个实例都有自己的内存空间。使用不同的后端,并验证所有实例都指向相同的文件或数据库位置。或者,您可以尝试一个使会话“粘性”的负载均衡器。谷歌是你的朋友。

有效期

响应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-'
_delete()[源代码]
_exists()[源代码]
_get_file_path()[源代码]
_load(path=None)[源代码]
_save(expiration_time)[源代码]
acquire_lock(path=None)[源代码]

获取当前加载的会话数据的独占锁。

clean_up()[源代码]

清除过期的会话。

pickle_protocol = 4
release_lock(path=None)[源代码]

释放当前加载的会话数据的锁。

classmethod setup(**kwargs)[源代码]

为基于文件的会话设置存储系统。

每个进程只能调用一次;当使用sessions.init时,这将自动完成(就像内置工具那样)。

class cherrypy.lib.sessions.MemcachedSession(id=None, **kwargs)[源代码]

基类:cherrypy.lib.sessions.Session

_delete()[源代码]
_exists()[源代码]
_load()[源代码]
_save(expiration_time)[源代码]
acquire_lock()[源代码]

获取当前加载的会话数据的独占锁。

locks = {}
mc_lock = <unlocked _thread.RLock object owner=0 count=0>
release_lock()[源代码]

释放当前加载的会话数据的锁。

servers = ['localhost:11211']
classmethod setup(**kwargs)[源代码]

为基于memcached的会话设置存储系统。

每个进程只能调用一次;当使用sessions.init时,这将自动完成(就像内置工具那样)。

class cherrypy.lib.sessions.RamSession(id=None, **kwargs)[源代码]

基类:cherrypy.lib.sessions.Session

_delete()[源代码]
_exists()[源代码]
_load()[源代码]
_save(expiration_time)[源代码]
acquire_lock()[源代码]

获取当前加载的会话数据的独占锁。

cache = {}
clean_up()[源代码]

清除过期的会话。

locks = {}
release_lock()[源代码]

释放当前加载的会话数据的锁。

class cherrypy.lib.sessions.Session(id=None, **kwargs)[源代码]

基类:object

一个类似cherrypy dict的会话对象(每个请求一个)。

_id = None
_regenerate()[源代码]
clean_freq = 5

过期会话清理的轮询速率(分钟)。

clean_thread = None

调用self.cleanu的类级监视器。

clean_up()[源代码]

清除过期的会话。

clear() None.  Remove all items from D.[源代码]
debug = False

如果为真,则记录调试信息。

delete()[源代码]

删除存储的会话数据。

generate_id()[源代码]

返回新会话ID。

get(k[, d]) D[k] if k in D, else d.  d defaults to None.[源代码]
property id

返回当前会话ID。

id_observers = None

要传递新ID的回调列表。

items() list of D's (key, value) pairs, as 2-tuples.[源代码]
keys() list of D's keys.[源代码]
load()[源代码]

将存储的会话数据复制到此会话实例中。

loaded = False

如果为真,则数据已从存储中检索。这应该在第一次尝试访问会话数据时自动发生。

locked = False

如果为true,则此会话实例对会话数据具有独占的读/写访问权限。

missing = False

如果客户端请求的会话不存在,则为true。

now()[源代码]

生成会话特定的“现在”概念。

其他会话提供程序可以重写此设置,以使用可选的“now”版本(可能是时区感知的)。

originalid = None

客户端传递的会话ID。可能丢失或不安全。

pop(key, default=False)[源代码]

删除指定的键并返回相应的值。如果找不到键,则返回默认值(如果给定),否则将引发keyError。

regenerate()[源代码]

替换当前会话(使用新的ID)。

regenerated = False

如果应用程序调用了session.regent(),则为true。这不是由内部调用设置以重新生成会话ID。

save()[源代码]

保存会话数据。

setdefault(k[, d]) D.get(k,d), also set D[k]=d if k not in D.[源代码]
timeout = 60

删除会话数据的分钟数。

update(E) None.  Update D from E: for k in E: D[k] = E[k].[源代码]
values() list of D's values.[源代码]
cherrypy.lib.sessions._add_MSIE_max_age_workaround(cookie, timeout)[源代码]

我们希望使用http://www.faqs.org/rfcs/rfc2109.html中指示的“最大年龄”参数,但IE不会将其保存到磁盘,如果用户关闭浏览器,会话就会丢失。所以我们不得不用旧的“过期”..。叹息..。

cherrypy.lib.sessions.close()[源代码]

关闭此请求的会话对象。

cherrypy.lib.sessions.expire()[源代码]

使当前会话cookie过期。

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.save()[源代码]

保存所有更改的会话数据。

为客户端设置响应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)。