我无法找到让它发挥作用的方法。我认为问题在于如何将类变量或类引用(self)传递给函数。代码类似于以下内容:
def isconnected(classref):
if not classref.serialObject:
raise cherrypy.HTTPError("403 Forbidden")
cherrypy.tools.isconnected = cherrypy.Tool('before_handler', isconnected)
然后在app类中,它应该像这样使用:
class Controller(object):
def __init__(self):
self.serialObject = None
@cherrypy.expose
@cherrypy.tools.isconnected(self.serialObject)
def serialVRead(self):
# code here
pass
换句话说,我基本上想在调用普通处理程序之前检查资源是否可用。此外,我需要它作为一个工具,因为我还有一些其他方法,我也想这样装饰。
此外,我还想知道是否可以使用与引发HTTPError异常不同的解决方案来阻止正常处理程序执行。我尝试了返回True或False但没有成功。
请让我知道这是否可行,或者是否有更好的方法来实现这一目标。谢谢。
PD。我正在运行Cherrypy的最新版本(我认为3.3)
答案 0 :(得分:0)
我认为您应该通过CherryPy Plugin与串行对象进行交互,并与以下内容进行通信:
serial_port = cherrypy.engine.publish('acquire_serial_port')
插件的想法是跨请求共享资源,封装并可重用。
您甚至可以将其混合到仅引用串行插件的已发布频道的工具中。
答案 1 :(得分:0)
1)您可以从cherrypy.serving.request.handler
检索当前处理程序所属的实例,如下所示:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import cherrypy
config = {
'global' : {
'server.socket_host' : '127.0.0.1',
'server.socket_port' : 8080,
'server.thread_pool' : 8
}
}
def isconnected():
instance = cherrypy.serving.request.handler.callable.__self__
if not instance.instanceAttr:
raise cherrypy.HTTPError("403 Forbidden")
cherrypy.tools.isconnected = cherrypy.Tool('before_handler', isconnected)
class App:
instanceAttr = None
def __init__(self):
self.instanceAttr = 123
@cherrypy.tools.isconnected()
@cherrypy.expose
def index(self):
return '''foo'''
if __name__ == '__main__':
cherrypy.quickstart(App(), '/', config)
2)通常在Python中,装饰器在它们成为实例方法之前对函数进行操作。如果您需要访问装饰器中的实例,则需要实现descriptor protocol(请参阅question about it)。因为CherryPy工具建立在装饰器之上但有自己的工作流程,描述符机制可能无法工作。
3)有条件地避免正常处理程序使用cherrypy._cptools.HandlerTool
(docs,wiki,question with example)。