Существует расширение pyramid_rewrite (https://pypi.python.org/pypi/pyramid_rewrite/), которое выглядит не поддерживаемым, но, кажется, работает. У меня был вариант использования, который он не обрабатывал, хотя: с помощью Configure.include () с параметром route_prefix.
Мне пришло в голову, что обычным подходом является перезапись URL-адресов на сервере, и я использовал WSGI-сервер из стандартной библиотеки Python. Насколько сложно это может быть?
Создание собственного обработчика запросовкласс:
from wsgiref.simple_server import make_server, WSGIRequestHandler
class MyReqHandler(WSGIRequestHandler):
def get_environ(self):
env = WSGIRequestHandler.get_environ(self)
if env['PATH_INFO'].startswith('/foo'):
env['PATH_INFO'] = env['PATH_INFO'].replace('foo', 'bar', 1)
return env
Передайте его в make_server () при создании сервера:
srvr = make_server('0.0.0.0', 6543, app, handler_class=MyReqHandler)
Это работает!
Прямая замена - все, что мне нужно дляПроблема под рукой. Расширить его для использования регулярных выражений и выставить его через красивый API было бы довольно просто.
У меня есть другое решение, это прямая пирамида, поэтому она будет работать с некоторым другим сервером wsgi:
from pyramid.events import NewRequest, subscriber
@subscriber(NewRequest)
def mysubscriber(event):
req = event.request
if req.path_info.startswith('/~cfuller'):
req.path_info = req.path_info.replace('foo', 'bar', 1)
Это декларативный способ, и он требует config.scan (). Необязательно, вы бы сделали что-то вроде
config.add_subscriber(mysubscriber, NewRequest)
См. http://docs.pylonsproject.org/projects/pyramid/en/1.5-branch/narr/events.html дляхудой на событиях.