2

カスタムsession/auth / users/aclシステムを使用してDjangoでフォーラムアプリを作成しています。目標の1つは、Cookieがオフになっている場合でも、ユーザーが私のアプリを参照して使用できるようにすることです。PHPの世界から来て、問題の最善の解決策は、ページ上のすべてのリンクにsid=を追加することです。これが私がそれをする方法です:

セッションミドルウェアは、ユーザーがセッションCookieを持っているかどうか、または私にCookieを覚えているかどうかを確認します。もしそうなら、これはおそらくクッキーが彼のために働くことを意味します。そうでない場合は、新しいセッションIDを生成し、新しいセッションを開いて(DBのセッションテーブルに新しいエントリを作成)、Cookieを送信して、ユーザーを現在の場所にリダイレクトしますが、URLにSIDを追加します。リダイレクト後、ミドルウェアはセッションIDがCookieまたはGETのいずれかから取得できるかどうかを確認します。Cookieの場合、URLへのsidの追加を停止します。GETの場合、それらを保持します。

django.core.urlresolvers.reverseとreverse_lazyに?sid =を追加する独自の関数を追加して、SID=部分をURLに挿入する予定です。ただし、両方のミドルウェアがurlresolverであり、スレッドセーフではないため、これによりいくつかの問題が発生します。これを克服するために、私は次のようなものを作成しました。

class SessionMiddleware(object):
    using_decorator = False
    original_reverse = None

    def process_request(self, request):        
        self.using_decorator = True
        self.original_reverse = urlresolvers.reverse
        urlresolvers.reverse = session_url_decorator(urlresolvers.reverse, 's87add8ash7d6asdgas7dasdfsadas')

    def process_response(self, request, response):
        # Turn off decorator if we are using it
        if self.using_decorator:
            urlresolvers.reverse = self.original_reverse
            self.using_decorator = False
        return response

SIDをリンク経由で渡す必要がある場合、process_requestはusing_decoratorをtrueに設定し、装飾されていないurlresolvers.reversを別のメソッドに格納します。ページがレンダリングされた後、process_responseはusing_decoratorをチェックして、「ガベージコレクション」を実行する必要があるかどうかを確認します。含まれている場合は、逆関数を元の装飾されていない状態に戻します。

私の質問は、このアプローチはスレッドセーフですか?または、フォーラムのトラフィックが増えると、ミドルウェアがこれらの機能を何度も何度も装飾し、「ガベージコレクション」の実行に失敗する可能性がありますか?また、正規表現を使用して、リンクに対して生成されたHTML応答を単純にスキミングし、正規表現によって省略された場所にSIDを手動で追加するためのテンプレートフィルターと変数を提供することも考えました。

どちらのアプローチが良いですか?また、現在の1つのスレッドは安全ですか?

4

1 に答える 1

1

まず第一に:URLでSIDを使用することは非常に危険です。たとえば、あなたがあなたとしてサインインしている友人のリンクをコピーして貼り付ける場合です。ほとんどのユーザーはSIDが何であるかを知らないため、この問題が発生します。そのため、URLでSIDを使用することは絶対にしないでください。また、Facebookや友達はすべてCookieを必要とするため、問題ないはずです...

それを考えると、モンキーパッチurlresolvers.reverseは幸運にも機能しません!カスタムURLResolversサブクラスで実行できる可能性がありますが、これはお勧めしません。

はい、ミドルウェアはスレッドセーフではありません。ミドルウェアは一度だけ初期化され、スレッド間で共有されます。つまり、自分自身に何かを保存することはスレッドセーフではありません

于 2012-05-29T08:18:31.453 に答える