কোনও ব্যবহারকারী লগ ইন হয়েছে কিনা তা কীভাবে পরীক্ষা করবেন (সঠিকভাবে User.is_authenticated কীভাবে ব্যবহার করবেন)?


250

আমি এই ওয়েবসাইটটি দেখছি তবে এটি কাজ করছে না এমনটি কীভাবে করা যায় তা ঠিক বুঝতে পারি না। আমার এখনকার সাইট ব্যবহারকারী লগ ইন হয়েছে কিনা তা যাচাই করা উচিত (সত্যায়িত), এবং চেষ্টা করছি:

request.user.is_authenticated

ব্যবহারকারী লগ ইন হয়েছে কিনা তা সত্ত্বেও, এটি ঠিক:

>

আমি অন্যান্য অনুরোধগুলি করতে সক্ষম হয়েছি (উপরের ইউআরএলের প্রথম বিভাগ থেকে), যেমন:

request.user.is_active

যা একটি সফল সাড়া দেয়।


1
is_authenticated (ভিতরে এবং বাইরে উভয় টেম্পলেট) সর্বদা সত্য ফিরিয়ে দেয় - ব্যবহারকারী আসলে লগ ইন করেছেন কিনা তা নির্বিশেষে। কোনও ব্যবহারকারী লগ ইন করেছেন কিনা তা সত্যভাবে সনাক্ত করতে একমাত্র সমাধান হ'ল সময়সীমার সাথে তাদের শেষ_সীমার তারিখ / সময়টির তুলনা করা
টনি সাফলক 66

উত্তর:


508

জাজানো 1.10+ এর জন্য আপডেট : is_authenticatedএখন জঙ্গো 1.10 এ একটি বৈশিষ্ট্য। পিছনের সামঞ্জস্যের জন্য পদ্ধতিটি এখনও বিদ্যমান, তবে জাজানো ২.০ এ সরানো হবে।

জ্যাঙ্গো ১.৯ এবং তার বেশি বয়সীদের জন্য :

is_authenticatedএকটি ফাংশন। আপনার এটি পছন্দ করা উচিত

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

পিটার রুওয়েল যেমন উল্লেখ করেছেন, আপনাকে ডিফল্ট জাঙ্গো টেম্পলেট ভাষায়, ফাংশনগুলি কল করার জন্য আপনি প্রথম বন্ধনী ব্যবহার করবেন না। সুতরাং আপনি টেমপ্লেট কোডে এরকম কিছু দেখে থাকতে পারেন:

{% if user.is_authenticated %}

যাইহোক, পাইথন কোডে এটি Userক্লাসে প্রকৃতপক্ষে একটি পদ্ধতি ।


ওহ ঠিক আছে .. তথ্যের জন্য ধন্যবাদ, এটি বুঝতে পেরেছিল যে কেন এটি কাজ করছে না, যদি না আমি কিছু মিস করি, তবে জাঙ্গো ডকুমেন্টেশনে এটি সম্পর্কে সত্যই স্পষ্ট নয়
রিক

2
@ রিক: আমি আপনার সাথে আলাদা হতে অনুরোধ করছি। is_authenticated () হ'ল শ্রেণীর মডেলগুলির পদ্ধতি বিভাগে তালিকাভুক্ত দ্বিতীয় আইটেম ser ব্যবহারকারী। বিভ্রান্তিকর কারণটি হ'ল টেমপ্লেট ল্যাঙ্গুয়েজটি (s) এর পিছনে ব্যবহার করে না , সুতরাং ব্যবহারকারিসিস_অথিতান্ত্রিক% if হলে আপনি {% এর মতো কিছু দেখতে পাবেন} যদি আপনি করা () 's আপনি একটি ত্রুটি পাবেন। (দেখুন docs.djangoproject.com/en/dev/topics/auth/... এবং docs.djangoproject.com/en/1.2/topics/templates/#variables )
পিটার রোয়েল

2
@ পিটার, উদাহরণস্বরূপ তারা () ব্যবহার করেন না, আমি বুঝতে পেরেছি যে আমি নিশ্চিত যে তারা কোথাও ব্যাখ্যা করেছে যে এটি একটি পদ্ধতি এবং এটি কীভাবে সঠিকভাবে করা যায়, এটি খুব সুন্দর যখন কোনও এপিআই বাস্তব জীবনের বাক্য গঠন ব্যবহার করে যাতে এটি জ্যাঙ্গোর মতো প্রজেক্টে নতুন কেউ দ্রুত নিয়ে যেতে পারেন, আমি কেবল পোষা প্রাণী হিসাবে অনুমান করি যে আমি জিনিসগুলির মধ্যে ঝাঁপিয়ে পড়ি তবে বুঝতে পারি আমার আরও কাছাকাছি হওয়া উচিত ছিল, সাহায্যের জন্য ধন্যবাদ
রিক

4
@ রিক: বাস্তব জীবনের বাক্য গঠন সম্পর্কে আমি আপনার সাথে পুরোপুরি একমত। টেমপ্লেট সিস্টেমের জন্য "প্রকৃত" প্রোগ্রামিং ভাষা ব্যবহার না করার জন্য তাদের কাছে (যা আমি বিবেচনা করি) লম্পট কারণগুলি শুনেছি, তবে তারা তা করেছে। আপনি জিনজা 2 ( jinja.pocoo.org/2 ) ব্যবহার করার জন্য চয়ন করতে পারেন এবং এটি আপনাকে পূর্ণ পাইথন ক্ষমতা দেবে, তবে তৃতীয় পক্ষের অ্যাপগুলির সংখ্যাগরিষ্ঠতা জাঙ্গো সিস্টেম ব্যবহার করার কারণে এটি প্রায়শই সংক্ষিপ্ত হতে পারে। জ্যাঙ্গো টেমপ্লেটগুলির অভ্যন্তরে অভিব্যক্তি পাওয়ার জন্য এক্সপ্রেট্যাগ ( djangosnippets.org/snippets/9 ) দেখুন। এটা কাজ করে।
পিটার রোয়েল

3
@ রিক ডকুমেন্টেশন বিভিন্ন সংস্করণের জন্য বিভিন্ন জিনিস বলে। মনে হচ্ছে 1.10 এর জন্য এটি আর কোনও পদ্ধতি নয়
ইয়ারছু

32

জ্যাঙ্গো 1.10+

একটি বৈশিষ্ট্য ব্যবহার করুন না একটি পদ্ধতি:

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

একই নামের পদ্ধতির ব্যবহারটি জাঙ্গো ২.০ এ অবমূল্যায়িত হয়েছে এবং জাজানো ডকুমেন্টেশনে আর উল্লেখ করা হয়নি।


নোট করুন যে জাঙ্গো 1.10 এবং 1.11 এর জন্য, সম্পত্তিটির মান হ'ল CallableBoolএকটি বুলিয়ান নয়, যা কিছু অদ্ভুত বাগ তৈরি করতে পারে। উদাহরণস্বরূপ, আমার একটি ভিউ ছিল যা জেএসএনকে ফিরিয়ে দিয়েছে

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। সমাধানটি ছিল জসনরেসপনস ব্যবহার করা, যা সিরিয়ালাইজ করার সময় কল্যাবলবুল অবজেক্টটি সঠিকভাবে পরিচালনা করতে পারে:

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

দস্তাবেজটি বলে: কেবল-পঠনযোগ্য বৈশিষ্ট্য যা সর্বদা সত্য (অজ্ঞাতনামা ব্যবহারকারী.আইস_আউথেন্টিকেটেড যা সর্বদা মিথ্যা হয় তার বিপরীতে)। এটি ব্যবহারকারীকে সত্যায়িত করা হয়েছে কিনা তা বলার উপায়। এটি কোনও অনুমতি বোঝায় না এবং ব্যবহারকারীর সক্রিয় রয়েছে বা বৈধ সেশন রয়েছে কিনা তা পরীক্ষা করে না। যদিও আপনি সাধারণভাবে অনুরোধটি ব্যবহারকারীর উপর এই বৈশিষ্ট্যটি পরীক্ষা করে দেখবেন যে এটি প্রমাণীকরণমিল্ডওয়্যার (বর্তমানে লগ-ইন করা ব্যবহারকারীকে উপস্থাপন করছে) দ্বারা জনপরিচিত হয়েছে কিনা তা জানতে, আপনার এই বৈশিষ্ট্যটি কোনও ব্যবহারকারীর উদাহরণের জন্য সত্য True
সোপান

সুতরাং যদি আপনি প্রদর্শন করতে চান - "ওয়েলকাম অতিথি" হিসাবে অ-অনুমোদনপ্রাপ্ত ব্যবহারকারী এবং "ওয়েলকাম .USERNAME" হিসাবে ব্যবহারকারীদের প্রমাণীকরণ করুন তবে টেমপ্লেটে নিম্নলিখিত ব্লকটি কাজ করতে পারে: r.% যদি user.is_authenticated%} <p> স্বাগতম {r. user.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

জন্য জ্যাঙ্গো 2.0+ ভার্সন ব্যবহার করুন:

    if request.auth:
       # Only for authenticated users.

আরও তথ্যের জন্য https://www.django-rest-framework.org/api-guide/requests/#auth দেখুন

অনুরোধ.user.is_authenticated () জ্যাঙ্গো 2.0+ সংস্করণে সরানো হয়েছে।


7
request.user.is_authenticatedএখনও বৈধ। তুমি জ্যাঙ্গো-বাকি-কাঠামোর ডকুমেন্টেশন উল্লেখ করা হয় জ্যাঙ্গো
grouchoboy
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.