2010-10-10 38 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

相關問題