Django जेनेरिक दृश्यों के लिए लॉगिन की आवश्यकता कैसे है?


87

मैं Django जेनेरिक व्यू द्वारा संभाले गए URL तक पहुंच को प्रतिबंधित करना चाहता हूं।

मेरे दृश्यों के लिए मुझे पता है कि login_requiredडेकोरेटर काम करता है। इसके अलावा जेनरिक व्यूज बनाएं / डिलीट / अपडेट करें login_required, लेकिन मैं अन्य जेनेरिक व्यूज के लिए ऐसा करने का तरीका नहीं खोज सका।

जवाबों:


104

Django <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'}),
    )

फ़ंक्शन-आधारित सामान्य दृश्य Django 1.4 में चित्रित किए गए हैं और Django 1.5 में हटा दिए गए हैं। लेकिन एक ही सिद्धांत लागू होता है, बस login_requiredडेकोरेटर के साथ वर्ग आधारित दृश्य के दृश्य फ़ंक्शन को लपेटें :

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

यहाँ login_url login_required (templateView.as_view (template_name = 'foo_index.html') निर्दिष्ट करने का तरीका बताया गया है
Saisiva A

101

Django 1.9 या django-braces का उपयोग कर

Django 1.9 ने एक LoginRequiredMixin पेश किया है जो इस प्रकार प्रयोग किया जाता है:

from django.contrib.auth.mixins import LoginRequiredMixin

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

यदि आप django के पुराने संस्करण का उपयोग कर रहे हैं, तो आप django-braces से बहुत समान मिक्सिन का उपयोग कर सकते हैं - Django संस्करण django-braces संस्करण पर आधारित था। django-braces 1.4.x अभी भी Django 1.4 का समर्थन करता है ताकि आप इसे पुराने संस्करणों के साथ उपयोग कर सकें।

पुराने तरीके

कक्षा आधारित विचारों को कैसे सजाया जाए, इसके लिए मुझे यह प्रश्न मिला, इसलिए उसके लिए उत्तर जोड़ना है:

यह वर्ग आधारित विचारों को सजाने पर प्रलेखन खंड में शामिल है । नहीं है urls.pyआवरण, या आप के लिए आवेदन कर सकते हैं डेकोरेटर dispatch()विधि। प्रलेखन से उदाहरण:

URL कॉन्फिडेंस में सजा

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

अगर मैं login_url सेट नहीं करता, लेकिन इसे सेटिंग पर सेट करें तो क्या यह डिफ़ॉल्ट रूप से इसे रीडायरेक्ट करेगा?
४itary में मराट मोक्यूर्तान

38

Django के संस्करण 1.3 के साथ सामान्य विचारों को कार्यों से वस्तुओं में बदल दिया है। जैसे, संस्करण 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'))),
)

प्रलेखन यह भी बताता है कि यह कैसे करना है।


2
कृपया, पाठक, इस उत्तर को ध्यान में रखें क्योंकि समय बीतता है और सॉफ्टवेयर विकसित होता है। पहला समाधान मेरे लिए काम नहीं कर रहा था।
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

Django 1.11 के लिए, आप क्लास-आधारित दृश्यों के लिए LoginRequiredMixin का उपयोग कर सकते हैं

सेटिंग्स फ़ाइल में आपको जोड़ना चाहिए

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

जहाँ हम काम करते हैं

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

Django => 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-based-views/intro/#decorating-the-class


1

निम्न का उपयोग करें:

from django.contrib.auth.decorators import login_required

@login_required
def your_view():
    # your code here

5
प्रश्न की तारीख के आधार पर, मुझे लगता है कि ओपी django के वर्ग-आधारित सामान्य विचारों के लिए एक समाधान के लिए पूछ रहा है ... फ़ंक्शन-आधारित विचार नहीं।
डॉल्फ

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);
            }
        )
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.