【问题标题】:Why are CherryPy object attributes persistent between requests?为什么 CherryPy 对象属性在请求之间是持久的?
【发布时间】:2011-04-23 08:17:46
【问题描述】:

我正在为我的 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?

【问题讨论】:

    标签: python request cherrypy persistent


    【解决方案1】:

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

    有关范围界定工作原理的所有详细信息,最好的来源是source code

    【讨论】:

    • 这就是我要找的。我想知道我是否可以为此使用 cherrypy.request 和 .response,而规范的方法正是我想要的。谢谢。
    • 如何从页面处理程序方法访问存储在cherrypy.request 上的属性?我是否需要从cherrypy.request 访问,或者它会自动作为**kwargs 传递?谢谢
    【解决方案2】:

    您发现自己从 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

    【讨论】:

    • 我明白了。我试图了解 self.body 如何保持不变,但 cherrypy.session 没有。 (我知道为什么它不打算这样做,但我想知道它是如何工作的。)仅仅是因为 Session 的类定义重新定义了它自己的属性吗?
    • 这是因为cherrypy.session为每个会话ID存储了不同的数据集合。如果您从给定会话模拟多个连接,您应该会看到数据累积。
    猜你喜欢
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    相关资源
    最近更新 更多