2010-04-16 4 views
1

Я использую Pylons и хочу добавить к нему некоторое промежуточное ПО, чтобы он ловил 401 кодов состояния и делает HTTP-переадресацию (302) на страницу входа в систему.Любое связующее ПО WSGI, чтобы перенаправить HTTP на определенный код состояния?

Я знаю, что есть встроенный StatusCodeRedirect в Пилоны, что действует подобным образом, но это не производит HTTP перенаправления, а скорее переадресовывает внутренне (это то, что я не хочу).

Есть ли существующее промежуточное программное обеспечение для добавления или любое общее промежуточное программное обеспечение, которое можно легко изменить, чтобы перенаправлять HTTP по определенным кодам статуса?

ответ

1

И наконец. Я реализовал свой собственный класс промежуточного слоя, который использует call_wsgi_application помощника функцию pylons.util

from pylons.util import call_wsgi_application 

class StatusCodeHTTPRedirect(object): 

    def __init__(self, wsgi_app, codes, redirect_to): 
     self.app = wsgi_app 
     # Transform codes to str for comparison 
     self.codes = tuple([str(x) for x in codes]) 
     self.redirect_to = redirect_to 

    def __call__(self, environ, start_response): 
     status, headers, app_iter, exc_info = call_wsgi_application(self.app, 
      environ, catch_exc_info=True) 

     if status[:3] in self.codes: 
      start_response('302 Found', [('Location', self.redirect_to)]) 
      return [] 

     start_response(status, headers, exc_info) 
     return app_iter 

Надеется, что это поможет кому-то

1

Это должно быть довольно близко, я не тестировал его, но он свободно основан на том, что я написал, что я использую так, чтобы при необходимости настроить.

from webob.dec import wsgify 


class Catch401AndRedirect(object): 
    """ 
    responds to 401 redirects to signin page 
    """ 

    def __init__(self, app, signin_url): 
     self._app = app 
     self._signin_url = signin_url 

    @wsgify 
    def __call__(self, request): 

     response = request.get_response(self._app) 

     if response.status_int == 401: 
      response.headers["Location"] = self._signin_url 
      response.status_int = 302 
     else: 
      return response 

редактировать: забыл упомянуть это решение требует WebOb, но так как вы используете пилоны уже, у вас есть эта зависимость.

0

Вы можете использовать полную аутентификацию & авторизационную библиотеку для Pylons. Двумя наиболее популярными являются: AuthKit и repoze.who. Они уже реализуют то, что вы хотите сделать.

Если вы не хотите использовать существующую библиотеку, вы можете написать собственное промежуточное программное обеспечение. Это просто Python, вызываемый f(environ, start_response), который обрабатывает данные запроса, хранящиеся в среде. Посмотрите на config/environment.py.

 Смежные вопросы

  • Нет связанных вопросов^_^