1

我正在使用 Pylons 并想向其中添加一些中间件,以便它捕获401 状态代码并使HTTP 重定向(302)到登录页面。

我知道 Pylons 中有内置的 StatusCodeRedirect 以类似的方式运行,但它不会产生 HTTP 重定向,而是在内部进行重定向(这是我不想要的)。

是否有任何现有的中间件要添加,或者任何可以轻松修改以在特定状态代码上进行 HTTP 重定向的通用中间件?

4

3 回答 3

1

最后。我已经实现了自己的中间件类,它使用pylons.util 的 call_wsgi_application辅助函数

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

希望这会对某人有所帮助

于 2010-04-16T18:47:55.380 回答
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,但是由于您已经在使用 pylons,所以您有这种依赖关系。

于 2010-04-16T17:26:04.633 回答
0

您可以为 Pylons 使用完整的身份验证和授权库。最受欢迎的两个是:AuthKitrepoze.who。他们已经实现了你想做的事情。

如果不想使用现有库,可以编写自定义中间件。它只是一个 Python 可调用的f(environ, start_response),它处理保存在环境中的请求数据。调查config/environment.py

于 2010-04-16T17:32:12.827 回答