カスタム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つのスレッドは安全ですか?