cherrypy处理所有请求与一个功能或类

时间:2011-07-11 23:22:00

标签: python routes cherrypy dispatcher

我想使用cherrypy,但我不想使用普通的调度程序,我想要一个能够捕获所有请求然后执行我的代码的函数。我认为我必须实现自己的调度程序,但我找不到任何有效的例子。你能通过发布一些代码或链接来帮助我吗?

由于

3 个答案:

答案 0 :(得分:13)

制作默认功能:

import cherrypy

class server(object):
        @cherrypy.expose
        def default(self,*args,**kwargs):
                return "It works!"

cherrypy.quickstart(server())

答案 1 :(得分:2)

您可以通过路线和定义自定义调度程序来完成您的要求

http://tools.cherrypy.org/wiki/RoutesUrlGeneration

如下所示。请注意分配给变量的类实例化,该变量用作所有路径的控制器,否则您将获得类的多个实例。这与链接中的示例不同,但我认为更符合您的要求。

class Root:
    def index(self):
        <cherrpy stuff>
        return some_variable

dispatcher = None
root = Root()

def setup_routes():
    d = cherrypy.dispatch.RoutesDispatcher()
    d.connect('blog', 'myblog/:entry_id/:action', controller=root)
    d.connect('main', ':action', controller=root)
    dispatcher = d
    return dispatcher

conf = {'/': {'request.dispatch': setup_routes()}}

希望有所帮助:)

答案 2 :(得分:1)

以下是CherryPy 3.2的简单示例:

from cherrypy._cpdispatch import LateParamPageHandler

class SingletonDispatcher(object):

    def __init__(self, func):
        self.func = func

    def set_config(self, path_info):
        # Get config for the root object/path.
        request = cherrypy.serving.request
        request.config = base = cherrypy.config.copy()
        curpath = ""

        def merge(nodeconf):
            if 'tools.staticdir.dir' in nodeconf:
                nodeconf['tools.staticdir.section'] = curpath or "/"
            base.update(nodeconf)

        # Mix in values from app.config.
        app = request.app
        if "/" in app.config:
            merge(app.config["/"])

        for segment in path_info.split("/")[:-1]:
            curpath = "/".join((curpath, segment))
            if curpath in app.config:
                merge(app.config[curpath])

    def __call__(self, path_info):
        """Set handler and config for the current request."""
        self.set_config(path_info)

        # Decode any leftover %2F in the virtual_path atoms.
        vpath = [x.replace("%2F", "/") for x in path_info.split("/") if x]
        cherrypy.request.handler = LateParamPageHandler(self.func, *vpath)

然后只需在配置中设置您想要的路径:

[/single]
request.dispatch = myapp.SingletonDispatcher(myapp.dispatch_func)

...其中“dispatch_func”是您“捕获所有请求的函数”。它将作为位置参数传递给任何路径段,并将任何查询字符串作为关键字参数传递。