Cherrypy обрабатывать все запросы с одной функцией или классом - PullRequest
5 голосов
/ 12 июля 2011

Я хотел бы использовать cherrypy, но я не хочу использовать обычный диспетчер, я хотел бы иметь функцию, которая перехватывает все запросы и затем выполняет мой код. Я думаю, что я должен реализовать свой собственный диспетчер, но я не могу найти никакого действительного примера. Можете ли вы помочь мне, опубликовав код или ссылку?

Спасибо

Ответы [ 3 ]

13 голосов
/ 14 сентября 2011

сделать функцию по умолчанию:

import cherrypy

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

cherrypy.quickstart(server())
2 голосов
/ 12 июля 2011

То, что вы просите, можно сделать с помощью маршрутов и определения собственного диспетчера

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()}}

Надеюсь, что помогает:)

1 голос
/ 12 июля 2011

Вот краткий пример для 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» - это ваша «функция, которая перехватывает все запросы». Любые сегменты пути будут переданы как позиционные аргументы, а любая строка запроса - как ключевые аргументы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...