วิธีการตรวจสอบว่าผู้ใช้เข้าสู่ระบบ (วิธีการใช้งานอย่างถูกต้อง user.is_authenticated)?


250

ฉันกำลังดูเว็บไซต์นี้แต่ดูเหมือนจะไม่เข้าใจวิธีการทำเช่นนี้เพราะมันไม่ทำงาน ฉันต้องตรวจสอบว่าผู้ใช้ไซต์ปัจจุบันเข้าสู่ระบบ (รับรองความถูกต้อง) และพยายาม:

request.user.is_authenticated

แม้จะแน่ใจว่าผู้ใช้เข้าสู่ระบบแล้วก็กลับมาเพียง:

>

ฉันสามารถทำคำขออื่น ๆ (จากส่วนแรกใน URL ด้านบน) เช่น:

request.user.is_active

ซึ่งส่งกลับการตอบสนองที่ประสบความสำเร็จ


1
is_authenticated (เทมเพลตทั้งภายในและภายนอก) จะส่งกลับค่า True เสมอ - ไม่ว่าผู้ใช้จะล็อกอินจริงหรือไม่ หากต้องการระบุว่าผู้ใช้ลงชื่อเข้าใช้อย่างแท้จริงหรือไม่ทางออกเดียวดูเหมือนจะเปรียบเทียบวันที่ / เวลาล่าสุดกับการหมดเวลา
Tony Suffolk 66

คำตอบ:


509

อัปเดตสำหรับ Django 1.10+ : is_authenticatedตอนนี้เป็นคุณลักษณะใน Django 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 %}

อย่างไรก็ตามในรหัสไพ ธ อนมันเป็นวิธีการในUserชั้นเรียน


โอ้โอเค .. ขอบคุณสำหรับข้อมูลที่ทำให้รู้สึกแล้วว่าทำไมมันไม่ได้ทำงานจนกว่าฉันพลาดบางสิ่งบางอย่างมันเป็นจริงไม่ชัดเจนเกี่ยวกับเรื่องนี้ในเอกสาร Django
ริก

2
@Rick: ฉันขอแตกต่างกับคุณ is_authenticated () เป็นรายการที่สองที่ระบุไว้ในส่วนวิธีการของแบบจำลองระดับผู้ใช้ สิ่งที่อาจทำให้เกิดความสับสนคือภาษาแม่แบบไม่ได้ใช้ส่วนท้าย () ดังนั้นคุณอาจเห็นบางสิ่งเช่น {% ถ้า user.is_authenticated%} คุณจะได้รับข้อผิดพลาดหากคุณใส่ () ของ (ดูที่docs.djangoproject.com/en/dev/topics/auth/…และdocs.djangoproject.com/en/1.2/topics/templates/#variables )
Peter Rowell

2
@ ปีเตอร์พวกเขาไม่ได้ใช้ () ในตัวอย่างฉันรู้ว่าฉันแน่ใจว่าพวกเขาอธิบายว่ามันเป็นวิธีการและวิธีการที่ถูกต้องมันดีเมื่อ API ใช้ไวยากรณ์ในชีวิตจริงเพื่อให้มัน สามารถนำมาได้อย่างรวดเร็วในโดยคนใหม่เพื่อโครงการเช่น Django เพียงสัตว์เลี้ยงโกรธผมคิดว่าเป็นฉันมักจะอ่านผ่าน ๆ สิ่ง แต่ฉันรู้ฉันควรจะได้มองใกล้ชิดและขอบคุณสำหรับความช่วยเหลือ
ริก

4
@Rick: ฉันเห็นด้วยกับคุณอย่างสมบูรณ์เกี่ยวกับไวยากรณ์ชีวิตจริง ฉันเคยได้ยินเหตุผลที่อ่อนแอที่พวกเขาไม่ได้ใช้ภาษาการเขียนโปรแกรม "ของจริง" สำหรับระบบเทมเพลต แต่นั่นคือสิ่งที่พวกเขาทำ คุณสามารถเลือกที่จะใช้ Jinja2 ( jinja.pocoo.org/2 ) และมันจะให้ความสามารถใน Python เต็มรูปแบบ แต่เนื่องจากแอพของบุคคลที่สามส่วนใหญ่ที่ใช้ระบบ Django นั้นมักจะยากที่จะผสมเข้าด้วยกัน ดู ExprTag ( djangosnippets.org/snippets/9 ) เพื่อหาวิธีรับนิพจน์ภายในเทมเพลต Django มันได้ผล.
Peter Rowell

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 ค่าของคุณสมบัติคือ a CallableBoolและไม่ใช่บูลีนซึ่งอาจทำให้เกิดข้อผิดพลาดบางอย่าง ตัวอย่างเช่นฉันมีมุมมองที่ส่งคืน 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วิธีแก้ไขคือใช้ JsonResponse ซึ่งสามารถจัดการวัตถุ CallableBool ได้อย่างถูกต้องเมื่อทำการจัดลำดับ:

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

1
แต่ is_authenticated (เทมเพลตทั้งภายในและภายนอก) จะส่งกลับค่า True สำหรับผู้ใช้จริง (และ False สำหรับผู้ใช้ที่ไม่ระบุชื่อ) เสมอ - ไม่ว่าผู้ใช้จะเข้าสู่ระบบจริงหรือไม่
Tony Suffolk 66

request.userก็ไม่เป็นไรเพราะวิธีการนี้ถูกนำมาใช้ในการ ไม่ว่าผู้ใช้จะเข้าสู่ระบบหรือไม่เพียง แต่มีความสำคัญในบริบทของคำขอเช่นเซสชันเบราว์เซอร์
Mark Chackerian

สมมติว่าแอปพลิเคชันออกจากระบบอย่างถูกต้องผู้ใช้ - ฉันเห็นบางอย่างที่ไม่
Tony Suffolk 66

22

บล็อกต่อไปนี้ควรใช้งานได้:

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

2
แต่ is_authenticated (เทมเพลตทั้งภายในและภายนอก) จะส่งกลับค่า True เสมอ - ไม่ว่าผู้ใช้จะเข้าสู่ระบบจริงหรือไม่ก็ตาม
Tony Suffolk 66

เอกสารกล่าวว่า: คุณลักษณะอ่านอย่างเดียวซึ่งเป็นจริงเสมอ (ตรงข้ามกับ AnonymousUser.is_authenticated ซึ่งเป็นเท็จเสมอ) นี่เป็นวิธีที่จะบอกว่าผู้ใช้ได้รับการรับรองความถูกต้องแล้วหรือไม่ นี่ไม่ได้หมายความถึงการอนุญาตใด ๆ และไม่ได้ตรวจสอบว่าผู้ใช้มีการใช้งานหรือมีเซสชันที่ถูกต้อง แม้ว่าโดยปกติคุณจะตรวจสอบคุณลักษณะนี้บน request.user เพื่อค้นหาว่ามีการเติมข้อมูลโดย AuthenticationMiddleware (แทนผู้ใช้ที่เข้าสู่ระบบในปัจจุบัน) คุณควรทราบว่าแอตทริบิวต์นี้เป็นจริงสำหรับอินสแตนซ์ผู้ใช้ใด ๆ
Sopan

ดังนั้นหากคุณต้องการแสดง - ผู้ใช้ที่ไม่ผ่านการตรวจสอบความถูกต้องเป็น "ยินดีต้อนรับผู้เยี่ยมชม" และรับรองความถูกต้องของผู้ใช้ในฐานะ "ยินดีต้อนรับ. USERNAME" การติดตามบล็อกในเทมเพลตสามารถทำงานได้: {% ถ้า user.is_authenticated%} <p> ยินดีต้อนรับ }} !!! </p> {% else%} <p> ยินดีต้อนรับแขก! </p> {% endif%}
Sopan

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 เสมอ - ไม่ว่าผู้ใช้จะเข้าสู่ระบบจริงหรือไม่ก็ตาม
Tony Suffolk 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

สำหรับDjangoเวอร์ชัน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ยังคงใช้ได้ คุณกำลังอ้างถึงเอกสาร django-rest-framework ไม่ใช่django
grouchoboy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.