如何编写一个函数工具来检查cherrypy中的类变量

时间:2015-04-07 18:25:31

标签: python cherrypy

我无法找到让它发挥作用的方法。我认为问题在于如何将类变量或类引用(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)

2 个答案:

答案 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.HandlerTooldocswikiquestion with example)。