Так как я провел пару часов, пробираясь через пилоны / маршруты / мензурки / и т.д.Источник, я думал, что поделюсь своим решением.
Сначала немного контекста.Я использую эластичный балансировщик нагрузки (ELB) в AWS с SSL-терминацией.Приложение построено для запуска исключительно через https;В конце концов, это мир после пожара.Он выглядит следующим образом:
ELB -> nginx -> pasteWSGI -> pylons
ELB очень хорош с точки зрения простоты, но любой вызов pylons.controllers.util.redirect вызовет перенаправление 302 на "http://mysite/". ELB не изменит это наобратный путь (без причины), и мой браузер будет отправлен обратно на порт 80, и на этом порту не будет прослушиваться ELB.
Я попытался обновить Mapper, как предложено выше.
- это не сработало,
- Я хотел, чтобы мои перенаправления были относительными. Переключение на https в пилонах означает, что генератор URL отправляется и выбирает хост для создания нового URL (https://localhost/....)
Обратите внимание, что Mapper.redirect_to работает "из коробки" и использует относительные перенаправления, поэтому нет необходимости возиться с этим. Основная проблема заключается в том, что controllers.redirect использует немного другой путь кода. В частности, в Routes,controllers.util.redirect не является редиректом (есть «если маршруты и маршруты. редирект», который переходит в False).
Мое решение: заменить все вызовы для перенаправленияс помощью нового метода контроллера (также называемого перенаправлением) для изменения перенаправлений с абсолютных на относительные перенаправления.
Код выглядит следующим образом:
lib / helpers.py
def relative_redirect(to_url, start_response):
"""Returns a redirect that is compatible with AWS ELB (no absolute http responses)
Using pylons.controllers.util.redirect triggers an exception that'll be turned into a 302
But with an absolute path so the response does not contains https but simple http
"""
start_response("302 Found", [("Content-Type", "text/plain; charset=utf-8"), ("Location", url(to_url))])
return ["You are being redirected to {0}".format(url(to_url))]
Этот бит вызывается из базового класса моих контроллеров:
class BaseController(WSGIController):
...
def redirect(self, to_url):
"""Force a relative redirection, to work with AWS ELB"""
return relative_redirect(to_url, self.start_response)