1

Pylonsを使用していて、それにミドルウェアを追加して、401ステータスコードをキャッチし、 HTTPリダイレクト(302)をサインインページに作成したいと考えています。

同様の方法で動作する組み込みのStatusCodeRedirectがPylonsにあることは知っていますが、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が必要であることに言及するのを忘れましたが、すでにpylonを使用しているため、その依存関係があります。

于 2010-04-16T17:26:04.633 に答える
0

Pylonsの完全な認証および承認ライブラリを使用できます。最も人気のある2つは、 AuthKitrepoze.whoです。彼らはすでにあなたがやりたいことを実装しています。

既存のライブラリを使用したくない場合は、カスタムミドルウェアを作成できます。f(environ, start_response)これは、environに保持されているリクエストデータを処理するPython呼び出し可能オブジェクトです。調べてくださいconfig/environment.py

于 2010-04-16T17:32:12.827 に答える