2016-06-28 290 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