Любое промежуточное программное обеспечение WSGI для перенаправления HTTP на определенный код состояния? - PullRequest
1 голос
/ 16 апреля 2010

Я использую Pylons и хочу добавить к нему промежуточное программное обеспечение, чтобы оно ловило 401 кодов состояния и делало HTTP Redirect (302) на страницу входа.

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

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

Ответы [ 3 ]

1 голос
/ 16 апреля 2010

Наконец-то. Я реализовал свой собственный класс промежуточного программного обеспечения, который использует 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 голос
/ 16 апреля 2010

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

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

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

0 голосов
/ 16 апреля 2010

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

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

...