request.user は SimpleLazyObject を返しますが、これを「起動」するにはどうすればいいでしょうか? 質問する

request.user は SimpleLazyObject を返しますが、これを「起動」するにはどうすればいいでしょうか? 質問する

次の方法があります:

def _attempt(actor):
    if actor.__class__ != User:
        raise TypeError

これはビューから呼び出されます:

self.object.attempt(self.request.user)

ご覧のとおり、_attempt メソッドは actor が 型 であると想定していますdjango.contrib.auth.models.Userが、オブジェクトは 型のようです。なぜそうなるのでしょうか。そして、もっと重要なのは、 (明らかに User オブジェクトの一種のラッパー)をオブジェクトにdjango.utils.functional.SimpleLazyObject変換するにはどうすればよいかということです。LazyObjectUser

詳細はRequest.user以下をご覧ください:https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.userこのドキュメントでは、 はオブジェクトrequest.userである必要があることを示しているようですUser...

======後編集=====

現在、次の方法があります:

def _attempt(obj, action, actor, msg): 
    actor.is_authenticated() 
    if isinstance(actor, LazyObject): 
        print type(actor) 

ユーザーを渡していますが、if条件は依然として true であり、アクターは依然として ですLazyObject。なぜそうなるのでしょうか?

ベストアンサー1

見る同様の質問に対する私の回答

Django は遅延ロードを行うため、認証状態に応じてまたは のrequest.userいずれかになります。属性がアクセスされたときにのみ「起動」し、適切なクラスを返します。残念ながら、はプリミティブ クラス属性であるためカウントされません。これが実際に型であることを知る必要がある場合があり、そのためまたはにプロキシするのは間違いです。UserAnonymousUser__class__SimpleLazyObjectUserAnonymousUser

簡単に言えば、あなたが持っているような比較は単純に不可能です。しかし、あなたは本当にここで何を達成しようとしていますか?たとえば、または であるかどうかを確認しようとしている場合はUser、そのためのAnonymousUserがあります。request.user.is_authenticated()

ただし、一般的なルールとして、ダックタイピングを乱用すべきではありません。パラメータは、特定の型またはサブタイプ(UserまたはUserSubClass)であるべきです。持っているそうしないと、混乱を招き、脆弱なコードになってしまいます。

おすすめ記事