为什么 CherryPy 对象属性在请求之间保持不变?

Wil*_*ton 4 python cherrypy request 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')
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

(第二个问题移到CherryPy 缓存如何工作?

syn*_*tel 5

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

由于这个原因,self.debug 维护“状态”,它是正在运行的服务器的一个属性。

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

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

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

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


fum*_*chu 5

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

对于范围界定如何工作的所有细节,最好的来源是源代码