Bir kullanıcının oturum açıp açmadığını nasıl kontrol edebilirim (user.is_authenticated nasıl kullanılır)?


250

Bu web sitesi üzerinden bakıyorum ama çalışmıyor gibi bunu nasıl anlamaya görünmüyor. Geçerli site kullanıcı oturum açmış (kimliği doğrulanmış) olup olmadığını denetlemek gerekir ve çalışıyorum:

request.user.is_authenticated

kullanıcının oturum açtığından emin olmasına rağmen, yalnızca şunu döndürür:

>

Aşağıdaki gibi diğer istekleri (yukarıdaki url'deki ilk bölümden) yapabilirim:

request.user.is_active

başarılı bir yanıt verir.


1
is_authenticated (hem iç hem de dış şablonlar), kullanıcının gerçekten giriş yapmış olup olmamasına bakılmaksızın her zaman True değerini döndürür. Bir kullanıcının oturum açıp açmadığını gerçekten belirlemek için, tek çözüm son_seen tarih / saatini zaman aşımı ile karşılaştırmak gibi görünüyor
Tony Suffolk 66

Yanıtlar:


509

Django 1.10+ için güncelleştirme : is_authenticatedartık Django 1.10'daki bir özelliktir. Yöntem geriye dönük uyumluluk için hala mevcuttur, ancak Django 2.0'da kaldırılacaktır.

Django 1.9 ve daha eski sürümler için :

is_authenticatedbir işlevdir. Şöyle demelisin

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

Peter Rowell'in işaret ettiği gibi, sizi harekete geçiren şey, varsayılan Django şablon dilinde, işlevleri çağırmak için parantezin üzerine yapışmamanızdır. Yani şablon kodunda böyle bir şey görmüş olabilirsiniz:

{% if user.is_authenticated %}

Ancak, Python kodunda, aslında Usersınıfta bir yöntemdir .


oh ok .. bilgi için teşekkürler, bu bir şey kaçırmadım, neden o zaman neden çalışma değildi mantıklı, django belgelerinde bu konuda gerçekten net değil
Rick

2
@ Rick: Senden farklı olmaya yalvarıyorum. is_authenticated (), sınıf modellerinin yöntemler bölümünde listelenen ikinci öğedir . Ne kafa karıştırıcı olabilir ki şablon dili yok değil sen {% user.is_authenticated% if} gibi bir şey görmesinden çok () 's, sondaki kullanın. () ' İ yerleştirirseniz bir hata alırsınız. (Bkz. Docs.djangoproject.com/en/dev/topics/auth/… ve docs.djangoproject.com/en/1.2/topics/templates/#variables )
Peter Rowell

2
@Peter, örneklerde () kullanmıyorlar, bir yöntemin ve düzgün bir şekilde nasıl yapılacağını açıkladıklarından eminim, bir API gerçek hayat sözdizimini kullandığında sadece güzel Django gibi bir projede yeni birisi tarafından çabucak alınabilir, sanırım bir şeyle uğraştığım için bir evcil hayvan tedirginim ama farkına varmalıyım, yardım için teşekkürler
Rick

4
@Rick: Gerçek hayat sözdizimi konusunda tamamen katılıyorum. Şablon sistemi için "gerçek" bir programlama dili kullanmadıkları için (düşündüğüm) topal nedenleri duydum, ama yaptıkları şey bu. Jinja2 ( jinja.pocoo.org/2 ) kullanmayı seçebilirsiniz ve size tam Python yetenekleri verecektir, ancak 3. taraf uygulamaların ezici çoğunluğu Django sistemini kullandığından bunları karıştırmak genellikle zordur. Django şablonlarının içinde ifadeler almanın bir yolu için ExprTag'a ( djangosnippets.org/snippets/9 ) bakın. İşe yarıyor.
Peter Rowell

3
@ Belgelere tıklayın farklı sürüm için farklı şeyler söylüyor. Görünüşe göre 1.10 artık bir yöntem değil
yairchu

32

Django 1.10+

Bir yöntem değil , bir özellik kullanın :

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

Aynı adı taşıyan yöntemin kullanımı Django 2.0'da kullanımdan kaldırılmıştır ve artık Django belgelerinde belirtilmemiştir.


Django 1.10 ve 1.11 için, özelliğin değerinin CallableBoolbir boolean değil, bazı garip hatalara neden olabileceğini unutmayın. Örneğin, JSON döndüren bir görünümüm vardı

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

mülk güncellendikten sonra request.user.is_authenticatedistisna atıyordu TypeError: Object of type 'CallableBool' is not JSON serializable. Çözüm, serileştirilirken CallableBool nesnesini düzgün işleyebilen JsonResponse'yi kullanmaktı:

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

1
ancak is_authenticated (hem iç hem de dış şablonlar) gerçek bir kullanıcı için (ve anonim bir kullanıcı için False) her zaman True döndürür - kullanıcının gerçekten oturum açmış olup olmadığına bakılmaksızın.
Tony Suffolk 66

Sorun yok çünkü bu yöntem kullanılıyor request.user. Bir kullanıcının oturum açmış olup olmadığı, yalnızca istek bağlamında (örneğin tarayıcı oturumu) önemli değildir.
Mark Chackerian

Uygulamanın kullanıcıları günlüğe kaydeder.
Tony Suffolk 66

22

Aşağıdaki blok çalışmalıdır:

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

2
ancak is_authenticated (hem iç hem de dış şablonlar), kullanıcının gerçekten giriş yapmış olup olmamasına bakılmaksızın her zaman True değerini döndürür.
Tony Suffolk 66

Belge şunu söylüyor: Her zaman True olan salt okunur özniteliği (her zaman False olan AnonymousUser.is_authenticated yerine). Bu, kullanıcının kimliğinin doğrulanıp doğrulanmadığını anlamanın bir yoludur. Bu herhangi bir izin anlamına gelmez ve kullanıcının aktif olup olmadığını veya geçerli bir oturumu olup olmadığını kontrol etmez. Normalde, şu anda oturum açmış olan kullanıcıyı temsil eden AuthenticationMiddleware tarafından doldurulup doldurulmadığını öğrenmek için request.user üzerinde bu özelliği kontrol etseniz de, bu özelliğin herhangi bir User örneği için True olduğunu bilmelisiniz.
Sopan

Dolayısıyla, kimliği doğrulanmamış kullanıcıları "Hoş Geldiniz Misafir" olarak görüntülemek ve kullanıcıların kimliklerini "Hoş Geldiniz .USERNAME" olarak görüntülemek istiyorsanız, şablonlardaki aşağıdaki blok çalışabilir: {% if user.is_authenticated%} <p> Hoş Geldiniz {{user.username }} !!! </p> {% else%} <p> Hoşgeldin Misafir !!! </p> {% endif%}
Sopan

7

Sizce:

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

Denetleyici işlevlerinde dekoratör ekleyin:

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

ancak is_authenticated (hem iç hem de dış şablonlar), kullanıcının gerçekten giriş yapmış olup olmamasına bakılmaksızın her zaman True değerini döndürür.
Tony Suffolk 66

request.user.is_authenticatedUygulamanızın her zaman kullanıcı oturumunu kapatacağını biliyorsanız kullanıcılara daha iyi
Tony Suffolk 66

0

Şablonunuzda kimliği doğrulanmış kullanıcıları kontrol etmek istiyorsanız:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.