Издатель mod_python и красивые URL

1

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

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

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

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

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

О, im на 2.5.2 Спасибо заранее

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

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

Теги:
url
friendly-url
mod-python

2 ответа

1
Лучший ответ

У вас должен быть объект 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.)

  • 0
    Это было бы головной болью, так как компоненты a1, a2, a3, вероятно, являются метками из базы данных: foo / article / may / 2009 / latest для article (), смешивающие информацию базы данных и ограничение 'latest' Кодирование всего этого в гнезде объектов будет сосать :) В любом случае, спасибо!
  • 0
    Вы не ждали моего редактирования ;-)
Показать ещё 5 комментариев
1

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

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

  • 0
    Спасибо, Хао Лянь: я думаю, что фреймворк приложения или промежуточное программное обеспечение больше, чем у издателя, излишне. В PHP я просто взорвал $ _SERVER [url_key_thing], и я понял, что Apache признал, что / foo / bar / a / b / c не существует, но что / foo / bar (как файл) существует и запустил его. Может быть, есть директива Apache?
  • 0
    @NewToPython: Похоже, вы думаете о PATH_INFO - вы можете использовать это и в Python, но с обработчиком издателя.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню