2016-06-28 293 views
2

上下文:cherrypy session當前鎖定請求開始並在請求結束時釋放鎖定。因此併發請求被串行處理並被阻塞。猴子修補子類

是否可以擴展一個類,覆蓋一些方法,其中新方法調用父方法,然後猴子修補結果?

例子:

from cherrypy.lib import sessions 
class LockingSession(sessions.RamSession): 
    def get(self, *args, **kwargs): 
     # acquire lock 
     super(LockingSession).get(*args, **kwargs) 
     # release lock 
sessions.RamSession = LockingSession 

的例子不工作 - 無限循環:-)

請問這是正確的做法。這可能嗎?如果是,如何?

+0

我不知道猴子補丁,但我會嘗試注入你的班級進入'sessions'模塊,而不是替換現有的模塊,然後在config中啓用它。看看這行https://github.com/cherrypy/cherrypy/blob/master/cherrypy/lib/sessions.py#L784 他們選擇在模塊中按名稱聲明的類。你應該使用這個。 – webKnjaZ

+0

以下是使用redis後端的自定義會話類的示例: https://bitbucket.org/webknjaz/blueberrypy-wk/src/cb2753de29c4ec0f1be00baf2e828b35e0939b47/src/blueberrypy/command.py?at=default&fileviewer=file-view-default#command .py-269:270 https://bitbucket.org/webknjaz/blueberrypy-wk/src/cb2753de29c4ec0f1be00baf2e828b35e0939b47/src/blueberrypy/session.py?at=default&fileviewer=file-view-default#session.py-33:91 – webKnjaZ

+0

不知道Mokey補丁:)我知道它是面向方面編程。也許這個線程可以提供幫助:http://stackoverflow.com/questions/286958/any-aop-support-library-for-python – Johan

回答

0

UPD(2016年10月1日):

pull request(合併在2016年9月4日和可用於CherryPy >= 8.1)引入了指定會話類的新途徑。 水木清華這樣應該滿足您的需求:

import cherrypy 

class Root: 
    ... 

class LockingSession(sessions.RamSession): 
    def get(self, *args, **kwargs): 
     # acquire lock 
     super(LockingSession).get(*args, **kwargs) 
     # release lock 

conf = { 
    ..., 
    'tools.sessions.storage_class': LockingSession, 
    ..., 
} 

cherrypy.quickstart(Root(), '/', conf) 

老答案:

下面應該工作:

from cherrypy.lib import sessions 
class LockingSession(sessions.RamSession): 
    def get(self, *args, **kwargs): 
     # acquire lock 
     super(LockingSession).get(*args, **kwargs) 
     # release lock 

sessions.LockingSession = LockingSession 
+0

在python 2.7.6或3.4.3中不適用。這是因爲,一旦在類的定義中指定了對象,就會使用對象引用,而不是名稱,並且不能用'='覆蓋該對象的引用。你在哪裏測試你的要求? – Poik

+0

不是我沒有,我只是比較工作和非工作代碼片段,並提出了這些建議。 – webKnjaZ

+0

@波克似乎你是對的。也許主題啓動器遇到不同的問題 – webKnjaZ