Существует не стандартное решение.Подход, который я использовал лично, заключается в определении перекрестных ссылок между приложениями в моем конфигурационном файле, и я написал некоторый код для автоматической вставки их в мои приложения в виде статических маршрутов (см. static=True
на config.add_route
), который позволяет использовать request.route_url
для генерации URL-адресов, внешних по отношению к вашему приложению.
Таким образом, я создаю конфигурацию, которая выглядит следующим образом:
[composite:main]
use = egg:Paste#urlmap
/ = home
/app1 = myapp1
/app2 = myapp2
[app:home]
use = egg:myproject#home
links =
app1 /app1
app2 /app2
[app:myapp1]
use = egg:myproject#myapp1
links =
home /
app2 /app2
[app:myapp2]
use = egg:myproject#myapp2
links =
home /
app1 /app1
Возможно, вам это покажется утомительным, но мне нравится контроль, который он обеспечивает на постоянной основе.основа приложения.В качестве альтернативы вы, вероятно, можете определить это в разделе [DEFAULT]
файла и наследовать его между приложениями.
Идея состоит в том, что этот конфиг позволит мне выполнить request.route_url('app1')
.
Я используюэтот код (поместите его в файл с именем что-то вроде app_links.py
и включите его через config.include('.app_links')
:
from urllib.parse import urlparse
from pyramid.settings import aslist
def link_pregenerator(request, elements, kwargs):
kwargs['_app_url'] = request.host_url
return elements, kwargs
def includeme(config):
settings = config.get_settings()
links = aslist(settings.get('links', ''), flatten=False)
for name, pattern in (item.split(' ', 1) for item in links):
parsed = urlparse(pattern)
if parsed.hostname:
config.add_route(name, pattern, static=True)
else:
config.add_route(
name, pattern,
pregenerator=link_pregenerator,
static=True,
)