Cherrypy Custom Dispatcher со статическими файлами - PullRequest
2 голосов
/ 01 января 2012

Я написал свой собственный диспетчер, который использует регулярные выражения для отображения маршрутов, однако я больше не могу размещать статические файлы в / 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,
        }
    }

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

1 Ответ

2 голосов
/ 01 декабря 2012

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

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

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

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

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

...