Bagaimana cara memeriksa apakah pengguna masuk (bagaimana menggunakan dengan benar user.is_authenticated)?

250

Saya melihat-lihat situs web ini, tetapi sepertinya tidak tahu bagaimana melakukan ini karena tidak berfungsi. Saya perlu memeriksa apakah pengguna situs saat ini login (dikonfirmasi), dan saya mencoba:

request.user.is_authenticated

meskipun yakin bahwa pengguna login, ia hanya mengembalikan:

>

Saya dapat melakukan permintaan lain (dari bagian pertama di url di atas), seperti:

request.user.is_active

yang mengembalikan respons yang sukses.

Rick
sumber
1
is_authenticated (templat di dalam dan di luar) selalu mengembalikan Benar - terlepas dari apakah pengguna benar-benar masuk atau tidak. Untuk benar-benar mengidentifikasi jika pengguna login, satu-satunya solusi tampaknya adalah membandingkan tanggal / waktu last_seen mereka dengan batas waktu
Tony Suffolk 66

Jawaban:

509

Pembaruan untuk Django 1.10+ : is_authenticatedsekarang merupakan atribut di Django 1.10. Metode ini masih ada untuk kompatibilitas mundur, tetapi akan dihapus dalam Django 2.0.

Untuk Django 1.9 dan lebih lama :

is_authenticatedadalah suatu fungsi. Anda harus menyebutnya seperti

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

Seperti yang ditunjukkan oleh Peter Rowell, yang mungkin membuat Anda tersandung adalah bahwa dalam bahasa templat Django default, Anda tidak menggunakan kurung untuk memanggil fungsi. Jadi, Anda mungkin telah melihat sesuatu seperti ini dalam kode templat:

{% if user.is_authenticated %}

Namun, dalam kode Python, ini memang metode di Userkelas.

Brian Neal
sumber
oh ok .. terima kasih atas informasinya, itu masuk akal lalu mengapa itu tidak berfungsi, kecuali saya melewatkan sesuatu, itu benar-benar tidak jelas tentang ini dalam dokumentasi Django
Rick
2
@ Rick: Saya mohon berbeda dengan Anda. is_authenticated () adalah item kedua yang tercantum di bagian metode model kelas. Pengguna. Apa yang mungkin membingungkan adalah bahwa bahasa template tidak tidak menggunakan trailing () 's, sehingga Anda mungkin melihat sesuatu seperti {% jika user.is_authenticated%}. Anda akan mendapatkan kesalahan jika memasukkan () ke dalam. (Lihat docs.djangoproject.com/en/dev/topics/auth/… dan docs.djangoproject.com/en/1.2/topics/templates/#variables )
Peter Rowell
2
@ Peter, baik mereka tidak menggunakan () dalam contoh, saya menyadari bahwa saya yakin mereka menjelaskan di suatu tempat bahwa ini adalah metode dan cara melakukannya dengan benar, itu hanya baik ketika API menggunakan sintaks kehidupan nyata di dalamnya sehingga dapat dengan cepat dibawa oleh seseorang yang baru ke proyek seperti Django, hanya hewan peliharaan kesal saya kira karena saya cenderung membaca hal-hal tetapi saya menyadari saya harus melihat lebih dekat, terima kasih atas bantuannya
Rick
4
@ Rick: Saya sepenuhnya setuju dengan Anda tentang sintaks kehidupan nyata. Saya telah mendengar (apa yang saya anggap) alasan lemah mereka untuk tidak menggunakan bahasa pemrograman "nyata" untuk sistem template, tapi itulah yang mereka lakukan. Anda dapat memilih untuk menggunakan Jinja2 ( jinja.pocoo.org/2 ) dan itu akan memberi Anda kemampuan Python penuh, tetapi karena sebagian besar aplikasi pihak ke-3 menggunakan sistem Django, seringkali sulit untuk mencampurkannya. Lihatlah ExprTag ( djangosnippets.org/snippets/9 ) untuk mengetahui cara mendapatkan ekspresi di dalam templat Django. Berhasil.
Peter Rowell
3
@Rick dokumentasi mengatakan hal yang berbeda untuk versi yang berbeda. Sepertinya untuk 1,10 itu bukan lagi metode
yairchu
32

Django 1.10+

Gunakan atribut, bukan metode:

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

Penggunaan metode dengan nama yang sama tidak digunakan lagi dalam Django 2.0, dan tidak lagi disebutkan dalam dokumentasi Django.


Perhatikan bahwa untuk Django 1.10 dan 1.11, nilai properti adalah a CallableBooldan bukan boolean, yang dapat menyebabkan beberapa bug aneh. Sebagai contoh, saya memiliki pandangan yang mengembalikan JSON

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

bahwa setelah diperbarui ke properti request.user.is_authenticatedmelempar pengecualian TypeError: Object of type 'CallableBool' is not JSON serializable. Solusinya adalah menggunakan JsonResponse, yang bisa menangani objek CallableBool dengan benar saat membuat serial:

return JsonResponse({
    "is_authenticated": request.user.is_authenticated
})
Mark Chackerian
sumber
1
tetapi is_authenticated (baik templat di dalam maupun di luar) selalu mengembalikan Benar untuk pengguna nyata (dan Salah untuk pengguna anonim) - terlepas dari apakah pengguna benar-benar masuk atau tidak.
Tony Suffolk 66
Tidak apa-apa karena metode ini digunakan request.user. Apakah pengguna masuk atau tidak hanya penting dalam konteks permintaan, misalnya sesi browser.
Mark Chackerian
Dengan asumsi aplikasi dengan benar mengeluarkan pengguna - Saya telah melihat beberapa yang tidak.
Tony Suffolk 66
22

Blok berikut harus berfungsi:

    {% if user.is_authenticated %}
        <p>Welcome {{ user.username }} !!!</p>       
    {% endif %}
Sopan
sumber
2
tetapi is_authenticated (baik templat di dalam maupun di luar) selalu mengembalikan Benar - terlepas dari apakah pengguna benar-benar masuk atau tidak.
Tony Suffolk 66
Dokumen tersebut mengatakan: Atribut hanya-baca yang selalu Benar (sebagai lawan dari AnonymousUser.is_authenticated yang selalu Salah). Ini adalah cara untuk mengetahui apakah pengguna telah dikonfirmasi. Ini tidak menyiratkan izin apa pun dan tidak memeriksa apakah pengguna aktif atau memiliki sesi yang valid. Meskipun biasanya Anda akan memeriksa atribut ini pada request.user untuk mengetahui apakah atribut tersebut telah diisi oleh AuthenticationMiddleware (mewakili pengguna yang saat ini masuk), Anda harus tahu bahwa atribut ini Benar untuk setiap instance Pengguna.
Sopan
Jadi, jika Anda ingin menampilkan - pengguna yang tidak diautentikasi sebagai "Welcome Guest" dan otentikasi pengguna sebagai "Welcome .USERNAME" maka blok berikut dalam templat dapat berfungsi: {% if user.is_authenticated%} <p> Selamat Datang {{user.username }} !!! </p> {% else%} <p> Selamat Datang Tamu !!! </p> {% endif%}
Sopan
7

Menurut Anda:

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

Di Anda fungsi pengontrol menambahkan dekorator:

from django.contrib.auth.decorators import login_required
@login_required
def privateFunction(request):
Cubiczx
sumber
tetapi is_authenticated (baik templat di dalam maupun di luar) selalu mengembalikan Benar - terlepas dari apakah pengguna benar-benar masuk atau tidak.
Tony Suffolk 66
lebih baik bagi pengguna request.user.is_authenticatedjika Anda tahu bahwa aplikasi Anda akan selalu mengeluarkan pengguna
Tony Suffolk 66
0

Jika Anda ingin memeriksa pengguna yang diautentikasi dalam templat Anda, maka:

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

Untuk versi Django 2.0+ gunakan:

    if request.auth:
       # Only for authenticated users.

Untuk info lebih lanjut kunjungi https://www.django-rest-framework.org/api-guide/requests/#auth

request.user.is_authenticated () telah dihapus dalam versi Django 2.0+.

Jatin Goyal
sumber
7
request.user.is_authenticatedmasih valid Anda merujuk dokumentasi Django-rest-framework bukan Django
grouchoboy