2010-10-10 37 views
4

我正在为我的CherryPy应用程序编写调试方法。有问题的代码是(非常)基本相同的:为什么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的产量增长。当我从一个客户端访问该页面,然后从另一个同时打开的客户端访问该页面,然后刷新浏览器时,输出是一个不断增加的“好的”字符串。在我的调试方法中,我还记录了用户特定的信息(即会话数据),并且也显示在两个用户的输出中。

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

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

是否有任何方法来设置一个对象属性,只会用于当前的请求?我知道每个请求都可以覆盖self.body,但似乎有点特别。在CherryPy中是否有标准或内置的方式?

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

回答

4

synthesizerpatel的分析是正确的,但如果你真的希望将一些数据存储每个要求,然后将其存储为一个属性上cherrypy.request,而不是在会议上。 cherrypy.request.response对象是每个请求的新对象,因此不用担心它们的任何属性都会在请求间持续存在。这是做到这一点的标准方法。只要确保你不覆盖cherrypy的内部属性!例如,cherrypy.request.body已经预留给您,例如,一个POST的JSON请求主体。

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

+0

这就是我一直在寻找的东西。我想知道我是否可以使用cherrypy.request和.response,并且规范的方法真的是我想要的。谢谢。 – 2010-10-11 22:24:25

+0

如何从页面处理程序方法访问存储在'cherrypy.request'中的属性?我需要从'cherrypy.request'访问,还是会自动作为'** kwargs'传递?谢谢 – 2017-08-07 12:02:00

4

你一针见血的头,你从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

+0

我明白了。我试图理解self.body是如何保持不变的,但是cherrypy.session不会。 (我知道*为什么*它没有打算,但我想知道*它是如何工作的。)仅仅因为Session的类定义重新定义了它自己的属性? – 2010-10-10 21:24:06

+0

这是因为cherrypy.session会为每个会话ID存储不同的数据集合。如果您模拟来自给定会话的多个连接,则应该看到数据累积。 – 2010-10-11 00:39:12

相关问题