Пользовательский диспетчер Cherrypy со статическими файлами

Я написал свой собственный диспетчер, который использует регулярные выражения для сопоставления маршрутов, однако я больше не могу размещать статические файлы в /static. Вот диспетчер и конфиг:

class Dispatcher(object):
def __init__(self):
    self.urls = {}

def __call__(self, path_info):
    print('Dispatcher called: ' + path_info)

    func = self.find_handler(path_info)
    cherrypy.serving.request.handler = func

def find_handler(self, path_info):
    request = cherrypy.serving.request
    request.config = cherrypy.config.copy()

    for url in self.urls:
        args = re.findall(url, path_info)

        if len(args) > 0:
            # in the case that the route is just a URL, we don't want
            # an extra argument in the method function
            try:
                args.remove(path_info)
            except ValueError:
                pass

            controller = self.urls[url]
            method = request.method.lower()

            return cherrypy._cpdispatch.LateParamPageHandler(getattr(controller, method), *args)

    return cherrypy.NotFound()

def connect(self, url, controller):
    if not url.endswith("$"):
        url += "$"

    self.urls[url] = controller

И конфиг:

config = {
        'global': {
            'server.socket_host': '0.0.0.0',
            'server.socket_port': port,
        },

        '/static': {
            'tools.staticdir.on': True,
            'tools.staticdir.dir': os.path.join(os.getcwd(), 'static'),
        },

        '/': {
            'request.dispatch': self.dispatcher,
        }
    }

Если я использую стандартный диспетчер, статические файлы работают как надо, однако, если я использую свой собственный, они больше не работают. Сделав отладку в диспетчере, статичные файлы идут через диспетчер, хотя у меня конкретно, что только в '/' заводится диспетчер.


person Tom Leese    schedule 01.01.2012    source источник


Ответы (1)


Я не знаком с cherrypy, но это кажется очевидным: все, что находится в /static, находится и в /, поэтому можно только догадываться, какую запись конфигурации он будет использовать. Хотелось бы надеяться, что "более конкретное имеет приоритет", но по вашему описанию это не так. Просмотр документации также не помогает, там нет упоминания о неоднозначной обработке пути.

Вы могли бы подумать, что изменение порядка может помочь, но поскольку это словарь, порядок не сохраняется.

Кажется, что Cherpy не может этого сделать. Если у него есть диспетчер по умолчанию, который перегружен другими, это может решить проблему. Другой вариант заключается в том, что ваш собственный диспетчер может вызвать статический, если он обнаружит путь.

Наконец, в документации говорится о «монтировании приложения в путь». Если вы это сделаете, вы можете изменить порядок. Если вы этого не сделаете, это может быть сделано автоматически, а выполнение этого вручную может решить вашу проблему.

Не все это может иметь смысл, поскольку, как я уже писал, я не знаком с вишневым, но я все равно надеюсь, что это вам немного поможет.

person Bas Wijnen    schedule 01.12.2012