ユーザーがログインしているかどうかを確認する方法(user.is_authenticatedを適切に使用する方法)


250

私はこのウェブサイトを見ていますが、機能していないため、これを行う方法を理解できないようです。現在のサイトユーザーがログイン(認証)されているかどうかを確認する必要があります。

request.user.is_authenticated

ユーザーがログインしていることは確かですが、次のように返されます

>

(上記のURLの最初のセクションから)次のような他の要求を行うことができます。

request.user.is_active

成功した応答を返します。


1
is_authenticated(テンプレートの内側と外側の両方)は、ユーザーが実際にログインしているかどうかに関係なく、常にTrueを返します。ユーザーがログインしているかどうかを正確に識別するための唯一の解決策は、last_seenの日付/時刻をタイムアウトと比較することです
Tony Suffolk 66

回答:


509

Django 1.10+の更新is_authenticatedDjango 1.10の属性になりました。このメソッドは下位互換性のためにまだ存在していますが、Django 2.0では削除されます。

Django 1.9以前の場合

is_authenticated関数です。あなたはそれを次のように呼ぶべきです

if request.user.is_authenticated():
    # do something if the user is authenticated

Peter Rowellが指摘したように、あなたをつまずかせる可能性があるのは、デフォルトのDjangoテンプレート言語では、関数を呼び出すために括弧を付けないということです。テンプレートコードで次のようなものを見たことがあるかもしれません。

{% if user.is_authenticated %}

ただし、Pythonコードでは、これは実際にUserクラスのメソッドです。


ああ、わかりました。情報に感謝します。それが理にかなっていて、なぜ機能しなかったか、私が何かを見逃していない限り、djangoのドキュメントではこれについて本当に明確ではありません
Rick

2
@リック:私はあなたと異なることを頼みます。is_authenticated()は、models.Userクラスのメソッドセクションにリストされる2番目の項目です。紛らわしいのは、テンプレート言語が末尾の()を使用していないため、{%if user.is_authenticated%}のように表示される可能性があることです。()を挿入するとエラーが発生します(docs.djangoproject.com/en/dev/topics/auth/…およびdocs.djangoproject.com/en/1.2/topics/templates/#variablesを参照してください)。)
Peter Rowell

2
@Peter、例では()を使用していませんが、メソッドとその方法を適切に説明していることは確かだと思います。APIで実際の構文を使用すると、私は物事流し読みする傾向があるが、私は、私は、近い助けに感謝を見ている必要があります実現としてすぐにDjangoのようなプロジェクトに新しい誰か、私は推測するだけのペットpeeveによってで撮影することができます
リック・

4
@リック:私は実際の構文についてあなたに完全に同意します。テンプレートシステムに "実際の"プログラミング言語を使用していないという(私が考える)根拠のない理由を聞いたことがありますが、それは彼らがしたことです。Jinja2jinja.pocoo.org/2)の使用を選択すると、Pythonのすべての機能を利用できますが、サードパーティのアプリの圧倒的多数がDjangoシステムを使用しているため、それらを混在させることは困難です。Djangoテンプレート内で式を取得する方法については、ExprTag(djangosnippets.org/snippets/9)を参照してください。できます。
Peter Rowell、2010

3
@Rickのドキュメントには、バージョンごとに異なることが記載されています。1.10のように見えますが、これはもはや方法ではありません
yairchu

32

Django 1.10以降

メソッドではなく属性を使用します。

if request.user.is_authenticated: # <-  no parentheses any more!
    # do something if the user is authenticated

同じ名前のメソッドの使用はDjango 2.0では非推奨であり、Djangoのドキュメントには記載されていません。


Django 1.10および1.11の場合、プロパティの値はCallableBoolブール値ではなくaであり、いくつかの奇妙なバグを引き起こす可能性があることに注意してください。たとえば、JSONを返すビューがありました

return HttpResponse(json.dumps({
    "is_authenticated": request.user.is_authenticated()
}), content_type='application/json') 

プロパティrequest.user.is_authenticatedに更新された後、例外がスローされていましたTypeError: Object of type 'CallableBool' is not JSON serializable。解決策は、シリアル化時にCallableBoolオブジェクトを適切に処理できるJsonResponseを使用することでした。

return JsonResponse({
    "is_authenticated": request.user.is_authenticated
})

1
しかし、is_authenticated(テンプレートの内部と外部の両方)は、ユーザーが実際にログインしているかどうかに関係なく、実際のユーザーの場合は常にTrue(匿名ユーザーの場合はFalse)を返します。
トニーサフォーク66

このメソッドはで使用されるため、問題ありませんrequest.user。ユーザーがログインしているかどうかは、ブラウザセッションなどのリクエストのコンテキストでのみ重要です。
Mark Chackerian

アプリケーションがユーザーを正しくログアウトすると仮定します-私はそうでないものを見てきました。
トニーサフォーク66

22

次のブロックが機能するはずです:

    {% if user.is_authenticated %}
        <p>Welcome {{ user.username }} !!!</p>       
    {% endif %}

2
しかし、is_authenticated(テンプレートの内部と外部の両方)は、ユーザーが実際にログインしているかどうかに関係なく、常にTrueを返します。
Tony Suffolk 66

ドキュメントは言う:常にTrueである読み取り専用属性(AnonymousUser.is_authenticatedが常にFalseであるのに対して)。これは、ユーザーが認証されているかどうかを確認する方法です。これは権限を意味するものではなく、ユーザーがアクティブであるか、有効なセッションを持っているかどうかはチェックしません。通常はrequest.userでこの属性をチェックして、AuthenticationMiddleware(現在ログインしているユーザーを表す)によって入力されているかどうかを確認しますが、どのUserインスタンスでもこの属性がTrueであることを知っておく必要があります。
ソパン

したがって、非認証ユーザーを「ようこそゲスト」として、ユーザーを「ようこそ.USERNAME」として認証する場合は、テンプレート内の次のブロックが機能します。{%if user.is_authenticated%} <p>ようこそ{{user.username }} !!! </ p> {%else%} <p>ようこそゲスト!!! </ p> {%endif%}
ソパン

7

あなたの見解では:

{% if user.is_authenticated %}
<p>{{ user }}</p>
{% endif %}

コントローラ関数にデコレータを追加します:

from django.contrib.auth.decorators import login_required
@login_required
def privateFunction(request):

しかし、is_authenticated(テンプレートの内部と外部の両方)は、ユーザーが実際にログインしているかどうかに関係なく、常にTrueを返します。
トニーサフォーク66

request.user.is_authenticatedアプリケーションが常にユーザーをログアウトさせることがわかっている場合は、ユーザーにとってより良い
Tony Suffolk 66

0

テンプレートで認証済みユーザーを確認する場合は、次のようにします。

{% if user.is_authenticated %}
    <p>Authenticated user</p>
{% else %}
    <!-- Do something which you want to do with unauthenticated user -->
{% endif %}

-5

ジャンゴ2.0+のバージョンが使用します。

    if request.auth:
       # Only for authenticated users.

詳細については、https://www.django-rest-framework.org/api-guide/requests/#authをご覧ください。

request.user.is_authenticated()はDjango 2.0+バージョンで削除されました。


7
request.user.is_authenticatedまだ有効です。あなたはないジャンゴ・休息・フレームワークのドキュメントを参照しているジャンゴ
grouchoboy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.