我正在使用 Pylons 并想向其中添加一些中间件,以便它捕获401 状态代码并使HTTP 重定向(302)到登录页面。
我知道 Pylons 中有内置的 StatusCodeRedirect 以类似的方式运行,但它不会产生 HTTP 重定向,而是在内部进行重定向(这是我不想要的)。
是否有任何现有的中间件要添加,或者任何可以轻松修改以在特定状态代码上进行 HTTP 重定向的通用中间件?
我正在使用 Pylons 并想向其中添加一些中间件,以便它捕获401 状态代码并使HTTP 重定向(302)到登录页面。
我知道 Pylons 中有内置的 StatusCodeRedirect 以类似的方式运行,但它不会产生 HTTP 重定向,而是在内部进行重定向(这是我不想要的)。
是否有任何现有的中间件要添加,或者任何可以轻松修改以在特定状态代码上进行 HTTP 重定向的通用中间件?
最后。我已经实现了自己的中间件类,它使用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
希望这会对某人有所帮助
这应该让你非常接近我虽然没有测试它,但它松散地基于我写的东西,我正在使用必要的调整。
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,所以您有这种依赖关系。
您可以为 Pylons 使用完整的身份验证和授权库。最受欢迎的两个是:AuthKit和repoze.who。他们已经实现了你想做的事情。
如果不想使用现有库,可以编写自定义中间件。它只是一个 Python 可调用的f(environ, start_response)
,它处理保存在环境中的请求数据。调查config/environment.py
。