2009-07-07 1 views
12

まず、これはではなく、と同じです。thisと同じです。 ModelBackendにはrequestのメンバーはありません。アクセスリクエストセッションfrom backend.get_user

グローバルリクエストオブジェクトまたはそのセッションIDにアクセスすることなく、現在のユーザーのセッションにアクセスしたいとします。

なぜですか?自分の認証バックエンドを書いて、に拡張しました。私は関数get_user (self, user_id)を持っており、これはすべてのリクエストで呼び出されます(これはDjangoの認証ミドルウェアによって自動的に行われます)。残念ながら、get_userにはrequestへのアクセス権がありませんが、私の場合はセッションのデータでチェックしたいのですが(なぜなら、私はローカルデータベースを持っていないため、リモートミドルウェアからすべてのデータを取得するからです。何らかのキャッシングを行う快適な方法です)。

答えて

4

RemoteUserBackenddjango.contrib.auth.backends)は、特別なミドルウェアRemoteUserMiddlewareを使用してリクエストデータにアクセスします。多分このようにすることもできます。

+0

申し訳ありませんが、これは古いスレッドですが、私は参照されたコードを見ていますが、私が今認証したユーザーの要求データにアクセスしている場所はわかりません。 – ThatAintWorking

+2

@RonSmith私は少しリンクを更新しました。そのトリックは、すべてが 'RemoteUserMiddleware.process_request'によって実行され、' request'オブジェクトが渡されるということです(middleware.py#L40)。 'Remote-User' HTTPヘッダー(L50)の有無をチェックし、そうであればそのデータを' RemoteUserBackend.authenticate'(L73)に渡し、その結果を 'request'(L77)に保存します。この場合、HTTPヘッダーの値だけがpassebですが、認証バックエンドでセッション情報が必要な場合は、ミドルウェアから事前にセッションを隠すことができます。 – drdaeman

+2

例として数行のコードで回答を更新してもよろしいですか?ありがとう。 –

6

小さいThreadLocalMiddlewareを使用することができます。要求オブジェクトをどこでも利用できるようにします。

from django_tools.middlewares import ThreadLocal 

request = ThreadLocal.get_current_request() 
# request.session <-- is now available 

は、あなたのsettings.pyのMIDDLEWARE_CLASSESタプルにミドルウェアを追加することを忘れないでください:

MIDDLEWARE_CLASSES = (
    ... 
    'django_tools.middlewares.ThreadLocal.ThreadLocalMiddleware', 
    ... 
) 
+0

残念ながら、それはGPL V3です... –

0

またauthenticate関数にあなたがそれを呼び出す任意の時間「を要求」パラメータを渡すことができます。

def authenticate(self, request, **kwargs): 
    .... 
+0

質問はget_user関数についてです。認証されていません(..) – chaim

+0

私は認証時に必要なときに便利な答えを見つけました。 – Jayen