为什么CherryPy对象属性在请求之间是持久的?

时间:2010-10-10 00:33:44

标签: python request cherrypy persistent

我正在为CherryPy应用程序编写调试方法。有问题的代码(非常)基本上等同于:

import cherrypy

class Page:
    def index(self):
        try:
            self.body += 'okay'
        except AttributeError:
            self.body = 'okay'
        return self.body
    index.exposed = True

cherrypy.quickstart(Page(), config='root.conf')

我很惊讶地注意到,从请求到请求,self.body的输出增长了。当我从一个客户端访问该页面,然后从另一个同时打开的客户端访问该页面,然后刷新两者的浏览器时,输出是一个不断增加的“okay”字符串。在我的调试方法中,我还记录了用户特定的信息(即会话数据),并且也显示在两个用户的输出中。

我假设这是因为python模块被加载到工作内存中而不是为每个请求重新运行。

我的问题是:这是如何工作的? self.debug是如何保留请求请求的,但是cherrypy.session和cherrypy.response不是吗?

有没有办法设置一个只用于当前请求的对象属性?我知道我可以根据每个请求覆盖self.body,但它似乎有点特别。在CherryPy中有标准或内置的方式吗?

(第二个问题转移到How does CherryPy caching work?

2 个答案:

答案 0 :(得分:4)

你发现你从self.body获得了相同的数据,因为它在运行CherryPy的Python进程的内存中是相同的。

self.debug因此保持“状态”,它是正在运行的服务器的属性。

要设置当前会话的数据,请使用cherrypy.session ['fieldname'] ='fieldvalue',以获取数据使用cherrypy.session.get('fieldname')。

您(程序员)不需要知道会话ID,cherrypy.session会为您处理 - 会话ID由动态自动生成,并通过在浏览器和服务器之间交换cookie来保持后续的查询/响应交互。

如果您没有在配置中为cherrypy.session指定storage_type,它将存储在内存中(服务器和您可以访问),但是如果您愿意,也可以将会话文件存储在磁盘上无需编写大量代码就可以从正在运行的服务器中挖掘出会话ID或密钥/对值,这是一种方便的调试方式。

有关详细信息,请查看http://www.cherrypy.org/wiki/CherryPySessions

答案 1 :(得分:4)

synthesizerpatel的分析是正确的,但是如果你真的想要按请求存储一些数据,那么将它作为属性存储在cherrypy.request上,而不是存储在会话中。 cherrypy.request.response对象对于每个请求都是新的,因此不用担心它们的任何属性会在请求中持续存在。这是规范的方式。只要确保你没有覆盖cherrypy的任何内部属性!例如,cherrypy.request.body已被保留用于处理您,例如,POSTed JSON请求正文。

有关确定范围的详细信息,最好的来源是source code