জ্যাঙ্গো জেনেরিক ভিউগুলির জন্য কীভাবে লগইন দরকার?


88

আমি জাঙ্গো জেনেরিক ভিউ দ্বারা পরিচালিত ইউআরএলগুলিতে অ্যাক্সেসকে সীমাবদ্ধ রাখতে চাই।

আমার দর্শনের জন্য আমি জানি যে login_requiredসজ্জাকারক কাজ করে। জেনেরিক ভিউগুলি তৈরি / মুছুন / আপডেট করুন login_requiredযুক্তিটি বিবেচনা করে তবে আমি অন্যান্য জেনেরিক দৃশ্যের জন্য এটি করার কোনও উপায় খুঁজে পাইনি।

উত্তর:


104

জ্যাঙ্গো <1.5 এর জন্য, আপনি আপনার ইউআরএলে ফাংশনটি মোড়ক দ্বারা একটি সজ্জা যুক্ত করতে পারেন, যা আপনাকে জেনেরিক ভিউগুলি মোড়ানোর অনুমতি দেয়:

from django.contrib.auth.decorators import login_required
from django.views.generic.simple import direct_to_template
urlpatterns = patterns('',
    (r'^foo/$', login_required(direct_to_template), {'template': 'foo_index.html'}),
    )

ফাংশন-ভিত্তিক জেনেরিক দর্শনগুলি জ্যাঙ্গো ১.৪ এ অবমুক্ত করা হয়েছে এবং জ্যাঙ্গো 1.5 তে সরানো হয়েছে। তবে একই নীতিটি প্রযোজ্য, কেবলমাত্র login_requiredসাজসজ্জারের সাথে শ্রেণিভিত্তিক দৃশ্যের ভিউ ফাংশনটি আবদ্ধ করুন:

login_required(TemplateView.as_view(template_name='foo_index.html'))

এখানে কীভাবে লগইন_আরল লগইন_প্রযুক্তি নির্দিষ্ট করতে হবে (টেমপ্লেট ভিউ.এএস_ভিউ (টেমপ্লেট_নাম = 'foo_index.html'))
সায়সিভা এ

103

জ্যাঙ্গো> = 1.9 বা জ্যাঙ্গো-ধনুর্বন্ধনী ব্যবহার করে

জাজানো ১.৯ একটি লগইন-রিকোয়ার্ডড মিক্সিন চালু করেছে যা এইভাবে ব্যবহৃত হয়:

from django.contrib.auth.mixins import LoginRequiredMixin

class MyView(LoginRequiredMixin, View):
    login_url = '/login/'
    redirect_field_name = 'redirect_to'

আপনি যদি জ্যাঙ্গোর একটি পুরানো সংস্করণ ব্যবহার করছেন তবে আপনি জাজানো - ব্রেসগুলি থেকে একই রকম মিশ্রণটি ব্যবহার করতে পারেন - জাঙ্গো সংস্করণটি জাঙ্গো-ব্রেস সংস্করণের উপর ভিত্তি করে তৈরি হয়েছিল। django-braces 1.4.x এখনও জাজানো 1.4 সমর্থন করে যাতে আপনি এটি বেশ পুরানো সংস্করণ সহ ব্যবহার করতে পারেন।

পুরানো পদ্ধতি

শ্রেণিবদ্ধ মতামতগুলি কীভাবে সাজাতে হয় তা গুগল করার সময় আমি এই প্রশ্নটি পেয়েছি, সুতরাং এর উত্তর যুক্ত করতে:

এটি শ্রেণিবদ্ধ দর্শনগুলি সজ্জিত করে ডকুমেন্টেশন বিভাগে আচ্ছাদিত । সেখানে urls.pyমোড়ক রয়েছে, বা আপনি dispatch()পদ্ধতিতে ডেকোরেটর প্রয়োগ করতে পারেন । ডকুমেন্টেশন থেকে উদাহরণ:

ইউআরএল কনফে সাজানো হচ্ছে

from django.contrib.auth.decorators import login_required, permission_required
from django.views.generic import TemplateView

from .views import VoteView

urlpatterns = patterns('',
    (r'^about/', login_required(TemplateView.as_view(template_name="secret.html"))),
    (r'^vote/', permission_required('polls.can_vote')(VoteView.as_view())),
)

ক্লাস সাজানো

from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView

class ProtectedView(TemplateView):
    template_name = 'secret.html'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(ProtectedView, self).dispatch(*args, **kwargs)

আরও তথ্যের জন্য উপরের লিঙ্কযুক্ত ডকুমেন্টেশন দেখুন।


অসাধারণ! তবে আমি def dispatchসাবক্লাস হিসাবে শুধুমাত্র পদ্ধতি সহ সহজ বর্গ তৈরি View। এখন আমি কেবল এই জাতীয় কিছু তৈরি করতে পারি:class ProtectedTemplateView(TemplateView, ProtectedView): pass
WBAR

আমি যদি লগইন_আরএল সেট না করে তবে সেটিংস এ সেট করি py
মারাত মখতিয়ানিয়ান

38

জেনেরিক দৃষ্টিভঙ্গি জ্যাঙ্গোর ১.৩ সংস্করণ সহ ফাংশন থেকে বস্তুতে পরিবর্তিত হয়েছে। এর মতো, উইল ম্যাককচেন এবং উইল হার্ডির উত্তরগুলির জন্য সংস্করণ 1.3 নিয়ে কাজ করার জন্য সামান্য পরিবর্তন দরকার:

from django.contrib.auth.decorators import login_required
from django.views.generic import TemplateView

urlpatterns = patterns('',
    (r'^foo/$', login_required(TemplateView.as_view(template_name='foo_index.html'))),
)

এছাড়াও ডকুমেন্টেশন বর্ণনা করে যে এটি কীভাবে করা যায়।


4
দয়া করে পাঠক, এই উত্তরটির কারণটি সময় সময় এবং সফ্টওয়্যার বিকশিত হওয়ার কারণে বিবেচনা করুন। প্রথম সমাধানটি আমার পক্ষে কাজ করছে না।
n3storm

12

আপনি যদি জেনারিক ভিউগুলিতে প্রশ্নটির (যেমন আমিরের পরামর্শ মতো) চারপাশে আপনার নিজের পাতলা মোড়ক লিখতে না চান তবে আপনি নিজের urls.pyফাইলেও এরকম কিছু করতে পারেন :

from django.conf.urls.defaults import *

# Directly import whatever generic views you're using and the login_required
# decorator
from django.views.generic.simple import direct_to_template
from django.contrib.auth.decorators import login_required

# In your urlpatterns, wrap the generic view with the decorator
urlpatterns = patterns('',
    (r'', login_required(direct_to_template), {'template': 'index.html'}),
    # etc
)

8

জাঙ্গো ১.১১ এর জন্য, আপনি ক্লাস-ভিত্তিক দর্শনগুলির জন্য লগইনআরকিয়ারড মিক্সিন ব্যবহার করতে পারেন

সেটিংস ফাইলটিতে আপনার যুক্ত করা উচিত

LOGIN_URL="/login/"

আপনার দেখায়

from django.contrib.auth.mixins import LoginRequiredMixin

class RestaurantLocationCreateView(LoginRequiredMixin,CreateView):
    ....

8

এটি অর্জনের আরেকটি উপায় নীচে রয়েছে, আমি পছন্দ করি যে এটি ফাংশন-ভিত্তিক ভিউগুলির সাথে এটি কীভাবে হয় তার সাথে বেশ মিল এবং সংশোধন urls.pyবা ওভাররাইডের প্রয়োজন হয় না dispatch:

@method_decorator(login_required, name='dispatch')
class YourGenericViewSubclass(TemplateView):
    #
    # View methods
    #

3

আমি জেনেরিক দৃষ্টিভঙ্গি থেকে প্রাপ্ত বহু দর্শনে লেখকের প্রয়োজনের পুনঃব্যবহারযোগ্য উপায় চেয়েছিলাম। আমি একটি প্রতিস্থাপন প্রেরণ ফাংশন তৈরি করেছি যা আমি আমার ভিউ ক্লাসে অন্যান্য ঘোষণার মতোই যুক্ত করতে পারি।

class Index(generic.ListView):
    model = models.HomePage
    dispatch = auth.dispatch

আমরা যেখানে কাজটি করি সেখানে auth.dispatch:

def dispatch(self, request, *args, **kw):
    """Mix-in for generic views"""
    if userSession(request):
        return  super(self.__class__, self).dispatch(request, *args, **kw)

    # auth failed, return login screen
    response = user(request)
    response.set_cookie('afterauth', value=request.path_info)
    return response

3

জাজানো => 3.0 এ এটি বেশ সহজ হয়ে যায়:

from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView

@method_decorator(login_required(login_url='/login/'), name='dispatch')
class ProtectedView(TemplateView):
    template_name = 'secret.html'

রেফারেন্সের জন্য: https://docs.djangoproject.com/en/3.0/topics/class- বেসড- ভিউস / সিন্ট্র/# decorating-theclass


1

নিম্নলিখিত ব্যবহার:

from django.contrib.auth.decorators import login_required

@login_required
def your_view():
    # your code here

4
প্রশ্নের তারিখের ভিত্তিতে, আমি ধরে নিই যে ওপি জাঙ্গোর ক্লাস-ভিত্তিক জেনেরিক দৃষ্টিভঙ্গি ... ফাংশন-ভিত্তিক মতামতের জন্য কোনও সমাধানের জন্য জিজ্ঞাসা করছে।
ডলফ

0

নিম্নলিখিত এই সমস্যাটি সমাধান করতে পারে।

// in views.py:
class LoginAuthenAJAX(View):
    def dispatch(self, request, *args, **kwargs):
        if request.user.is_authenticated:
            jsonr = json.dumps({'authenticated': True})
        else:
            jsonr = json.dumps({'authenticated': False})
        return HttpResponse(jsonr, content_type='application/json')

// in urls.py
    path('login_auth', views.LoginAuthenAJAX.as_view(), name="user_verify"),

//in xxx.html
<script src = “{% static “xxx/script.js” %}” 
var login_auth_link = “{%  url ‘user_verify’ %}”
</script>

// in script.js
        $.get(login_auth_link, {
            'csrfmiddlewaretoken' : csrf_token,
            },
            function(ret){
                if (ret.authenticated == false) {
                    window.location.pathname="/accounts/login/"
                }
                $("#message").html(ret.result);
            }
        )

0

আমি এই জবাবটি খুঁজে না পাওয়া পর্যন্ত আমি দীর্ঘদিন ধরে এর উত্তর খুঁজতে লড়াই করে যাচ্ছিলাম।

মডেল.পি-তে করুন: django.db আমদানি মডেলগুলি থেকে

class YourLoginModel:
      fullname = models.CharField(max_length=255, default='your_name', unique=True)
      email  = models.EmailField(max_length=255, unique=True)
      username = models.CharField(max_length=255, unique=True)
      password = models.CharField(max_length=255) #using werkzeug's 
                                                  #generate_password_hash on plaintext password before committing to database model

Form.py do তে:

from django import forms
from .models import YourLoginModel

class LoginForm(forms.ModelForm):
      class Meta:
            model = YourLoginModel
            fields = ('username', 'password')

View.py লগইন যুক্তিতে:

def login(request):
    #login logic here
     # init empty form
    form = LoginForm()

    if request.method == 'POST':

        try:
            # peforms a Select query in db and gets user with log in username
            user_logging_in = User.objects.get(username=request.POST['username'])

            # assign user hash to var
            hash = user_logging_in.password

            # assign form str passs word to var
            password = request.POST['password']

        # if the user does not exist
        except ObjectDoesNotExist:
            html_response = 'User does not exists'
            return HttpResponse(html_response)

        # peform password and hash check
        if check_password_hash(hash, password):
 
            #using sessions cookies to know who we're interacting with
            request.session['username'] = request.POST['username']

            #set expiry date of the session
            request.session.set_expiry(0) # 0 means when the browser is closed

            return redirect('yourapp:home')
        else:
            return HttpResponse('password was incorrect')

    html = 'Login'
    return render(request, 'login.html', {'form': form})

অ্যাপ্লিকেশন দৃশ্যে আপনার উপর login_required সম্পাদন করতে চান Do

from django.views.generic import TemplateView

class yourTemplateView(TemplateView):
      template_name = 'your_template.html'
      def dispatch(self, request, *args, **kwrags):
           if not request.session.has_key('username'):
              #return HttpResponse('not logged in')
              return redirect('yourapp:login.html')
           else:
              return render(request, 'your_view.html')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.