Издатель mod_python и красивые URL - PullRequest
1 голос
/ 08 мая 2009

Я новичок в Python (я выхожу из PHP из-за того, что он все больше ломается), и я бегу через портирование своего старого кода. Одна вещь:

У меня есть файл /foo.py с функциями index () и bar (), так что с издателем я могу получить доступ к http://domain/foo/bar и http://domain/foo, как следует из документации.

Как я могу сделать так, чтобы я мог сделать:

http://domain/foo/bar/a1/a2/a3/an/...

Так, что издатель запускает bar (), а затем я могу получить доступ к URL, чтобы получить / a1 / a2 / ... Все, что я получаю, это Запрещено :) (я не хочу использовать mod_rewrite для всего)

О, я на 2.5.2 Заранее спасибо

ОБНОВЛЕНИЕ: идеальным решением было бы для издателя запустить крайнее правильное разрешение в URL-адресе, который он может, и просто сделать a1 / a2 / a3 .. доступным через модуль apache. Может быть, сочетание директивы Apache и издателя?

решено (ish): Ответ волшебного вызова () и т. Д. Сочный! Хотя я думаю, что я изменю издателя или напишу свой собственный, чтобы проверять объекты аналогичным образом, используя сопоставление крайних правых, а затем разрешать крайним правым доступ к URL-адресу с помощью модуля apache. Спасибо всем!

Ответы [ 2 ]

1 голос
/ 08 мая 2009

Я считаю, что это выходит за рамки возможностей алгоритма публикации, насколько я знаю. ( Документация определенно не упоминает об этом. ) Однако вы можете написать свой собственный обработчик mod_python ( пример здесь ), который, однако, расширяет алгоритм публикации.

Лучшим решением было бы взглянуть на mod_wsgi и создать вместо этого ваше веб-приложение как WSGI-приложение . Вы получили бы выгоду от полок и полок промежуточного программного обеспечения WSGI, но, в частности, вы могли бы использовать программное обеспечение для маршрутизации, такое как Routes , которое специально разработано для обработки этих случаев, когда публикация объектов недостаточно сильна. Но я не знаю ваших сроков, так что это может или не может быть осуществимо.

1 голос
/ 08 мая 2009

Вы должны иметь объект bar.a1.a2.a3.an, определенный в вашем модуле foo.py. По сути, обработчик издателя заменяет косые черты в URL точками и пытается найти некоторый объект Python с этим именем.

Вы должны иметь объект bar.a1.a2.a3.an, определенный в вашем модуле foo.py. По сути, обработчик издателя заменяет косые черты в URL точками и пытается найти некоторый объект Python с этим именем.

Вот кое-что дурацкое, что вы можете попробовать: в foo.py:

class _barclass(object):
    def __init__(self, parent, name):
        if parent and name:
            self.path = parent.path + '/' + name
            setattr(parent, name, self)
        else:
            self.path = ''
    def __getattr__(self, name):
        return _barclass(self, name)
    def __call__(self):
        # do your processing here
        # url path is contained in self.path

bar = _barclass(None, None)

Хотя это своего рода ограничение границ того, что должен делать издатель - вам лучше написать свои собственные обработчики с нуля. (Или используя что-то вроде Django.)

...