यदि कोई उपयोगकर्ता लॉग इन है (उपयोगकर्ता ठीक से उपयोग कैसे करें) की जाँच कैसे करें?


250

मैं इस वेबसाइट को देख रहा हूं, लेकिन यह पता नहीं लगा सकता कि यह कैसे करना है क्योंकि यह काम नहीं कर रहा है। मुझे यह जाँचने की आवश्यकता है कि क्या वर्तमान साइट उपयोगकर्ता लॉग इन है (प्रमाणीकृत), और मैं कोशिश कर रहा हूँ:

request.user.is_authenticated

यह सुनिश्चित करने के बावजूद कि उपयोगकर्ता लॉग इन है, यह अभी वापस आता है:

>

मैं अन्य अनुरोध करने में सक्षम हूं (ऊपर url में पहले खंड से), जैसे:

request.user.is_active

जो एक सफल प्रतिक्रिया देता है।


1
is_authenticated (अंदर और बाहर दोनों टेम्पलेट) हमेशा सही-सही लौटते हैं - भले ही उपयोगकर्ता वास्तव में लॉग इन हो या न हो। यदि किसी उपयोगकर्ता द्वारा लॉग इन किया गया है, तो सही तरीके से पहचानने के लिए, एकमात्र समाधान उनकी अंतिम तिथि / समय की समय-समय पर तुलना करना प्रतीत होता है
टोनी

जवाबों:


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

जैसा कि पीटर रोवेल ने बताया है, जो आपको ट्रिपिंग कर सकता है वह यह है कि डिफ़ॉल्ट Django टेम्पलेट भाषा में, आप फ़ंक्शन को कॉल करने के लिए कोष्ठक पर व्यवहार नहीं करते हैं। तो हो सकता है कि आपने कुछ इस तरह से टेम्पलेट कोड में देखा हो:

{% if user.is_authenticated %}

हालांकि, पायथन कोड में, यह वास्तव में Userकक्षा में एक विधि है ।


ओह ठीक है .. इस जानकारी के लिए धन्यवाद, यह समझ में आता है कि यह काम क्यों नहीं कर रहा था, जब तक कि मैं कुछ याद नहीं करता, यह वास्तव में इस बारे में स्पष्ट नहीं है django प्रलेखन
रिक

2
@ रिक: मैं आपसे अलग होने की भीख माँगता हूँ। is_authenticated () वर्ग मॉडल के विधि अनुभाग में सूचीबद्ध दूसरा आइटम है । उपयोगकर्ता। यह भ्रामक हो सकता है कि टेम्प्लेट भाषा अनुगामी () का उपयोग नहीं करती है , इसलिए हो सकता है कि आपको कुछ% {user.is_authenticated%} जैसा दिखाई दे। यदि आप () () डॉक्सJangoproject.com/en/dev/topics/auth/… और docs.djangoproject.com/en/1.2/topics/temperpress ## variables में देखें तो आपको एक त्रुटि मिलेगी )
पीटर रोवेल

2
@Peter, उदाहरण के लिए वे () का उपयोग नहीं करते हैं, मुझे एहसास है कि मुझे यकीन है कि उन्होंने कहीं समझाया है कि इसकी विधि और इसे ठीक से कैसे किया जाए, इसका अच्छा है जब एक एपीआई इसमें वास्तविक जीवन वाक्यविन्यास का उपयोग करता है ताकि यह Django जैसी परियोजना के लिए किसी नए व्यक्ति द्वारा जल्दी से ले जाया जा सकता है, बस एक पालतू जानवर की तरह मुझे लगता है कि मैं चीजों के माध्यम से स्किम करता हूं, लेकिन मुझे एहसास है कि मुझे करीब से देखना चाहिए था, मदद के लिए धन्यवाद
रिक

4
@ क्लिक करें: मैं वास्तविक जीवन वाक्य रचना के बारे में आपसे पूरी तरह सहमत हूँ। मैंने टेम्पलेट प्रणाली के लिए "वास्तविक" प्रोग्रामिंग भाषा का उपयोग नहीं करने के लिए लंगड़ा कारणों के बारे में सुना है (जो मैं मानता हूं)। आप जिन्जा 2 ( jinja.pocoo.org/2 ) का उपयोग करने का विकल्प चुन सकते हैं और यह आपको पूर्ण पायथन क्षमता प्रदान करेगा, लेकिन चूंकि 3 जी पार्टी के अधिकांश ऐप Django प्रणाली का उपयोग करते हैं, इसलिए उन्हें अक्सर रोकना मुश्किल है। Django टेम्प्लेट के अंदर अभिव्यक्ति प्राप्त करने के तरीके के लिए ExprTag ( djangosnippets.org/snippets/9 ) देखें। यह काम करता हैं।
पीटर रोवेल

3
@ क्लिक करें प्रलेखन अलग-अलग संस्करण के लिए अलग-अलग चीजें कहता है। 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और एक बूलियन नहीं है, जो कुछ अजीब कीड़े पैदा कर सकता है। उदाहरण के लिए, मेरे पास एक दृश्य था जो 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 (अंदर और बाहर दोनों टेम्पलेट) हमेशा वास्तविक उपयोगकर्ता (और अनाम उपयोगकर्ता के लिए गलत) के लिए सही है - उपयोगकर्ता वास्तव में लॉग इन है या नहीं, इसकी परवाह किए बिना।
टोनी सफ़ोकल 66

यह ठीक है क्योंकि इस पद्धति का उपयोग किया जाता है request.user। एक उपयोगकर्ता लॉग इन है या नहीं केवल अनुरोध के संदर्भ में मायने रखता है, उदाहरण के लिए ब्राउज़र सत्र।
मार्क चकेरियन

एप्लिकेशन को सही ढंग से मान लेने से उपयोगकर्ता बाहर हो जाते हैं - मैंने कुछ ऐसे देखे हैं जो नहीं करते हैं।
टोनी सफ़ोकल 66

22

निम्नलिखित ब्लॉक को काम करना चाहिए:

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

2
लेकिन is_authenticated (अंदर और बाहर दोनों तरह के टेम्पलेट) हमेशा सही रिटर्न देते हैं - भले ही उपयोगकर्ता वास्तव में लॉग इन हो या नहीं।
टोनी सफ़ोकल 66

दस्तावेज़ कहता है: केवल-पढ़ने का गुण जो हमेशा सत्य होता है (जैसा कि AnonymousUser.is_authenticated का विरोध किया जाता है जो हमेशा गलत होता है)। यह बताने का एक तरीका है कि क्या उपयोगकर्ता को प्रमाणित किया गया है। यह किसी भी अनुमति का अर्थ नहीं है और यह जाँच नहीं करता है कि उपयोगकर्ता सक्रिय है या उसके पास एक वैध सत्र है। भले ही आम तौर पर आप अनुरोध पर इस विशेषता की जांच करेंगे। यह पता लगाने के लिए कि क्या यह प्रमाणीकरणमेडवेयरवेयर (वर्तमान में लॉग-इन उपयोगकर्ता का प्रतिनिधित्व करते हुए) द्वारा आबाद किया गया है, आपको पता होना चाहिए कि यह विशेषता किसी भी उपयोगकर्ता के उदाहरण के लिए सही है।
सोपान

इसलिए यदि आप "वेलकम गेस्ट" के रूप में अन-प्रमाणित उपयोगकर्ताओं को "वेलकम गेस्ट" के रूप में प्रदर्शित करना चाहते हैं और उपयोगकर्ताओं को "वेलकम .USERNAME" के रूप में प्रमाणित करते हैं, तो टेम्प्लेट में निम्नलिखित ब्लॉक काम कर सकते हैं: {% if user.is_authenticated%} <p> वेलकम {{उपयोगकर्ता .username }} !!! </ p> {% और%} <p> स्वागत अतिथि !!! </ p> {% एंडिफ%}
सोपान

7

आपके विचार में:

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

नियंत्रक कार्यों में आप डेकोरेटर जोड़ सकते हैं:

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

लेकिन is_authenticated (अंदर और बाहर दोनों तरह के टेम्पलेट) हमेशा सही रिटर्न देते हैं - भले ही उपयोगकर्ता वास्तव में लॉग इन हो या नहीं।
टोनी सफ़ोकल 66

उपयोगकर्ता के लिए बेहतर है request.user.is_authenticatedयदि आप जानते हैं कि आपका एप्लिकेशन हमेशा उपयोगकर्ता को लॉग आउट करेगा
टोनी सफ़ोकल 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-आराम-ढांचे प्रलेखन संदर्भित कर रहे हैं Django
grouchoboy
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.