2012-01-09 20 views
7

मैं stackoverflow करने के लिए और django के लिए नया हूँ में auth.views.login उल्टा करने के लिए प्रयास करें ...Django नौसिखिया: login_required() डेकोरेटर

संक्षिप्त प्रश्न ("लंबे समय से सवाल" के लिए नीचे देखें), निम्नलिखित कोड myapps में/views.py विफल रहा:

from django.core.urlresolvers import reverse 
... 
@login_required(login_url=reverse('django.contrib.auth.views.login')) 
def my_view(request): 
    pass 

त्रुटि है:

ViewDoesNotExist at/
tried my-view2 in module myproject.myapps.views. Error was: 'module' object has no attribute 'my-view2' 

'मेरे-view2' मेरे-व्यू के बाद myapps/views.py में परिभाषित किया गया है (और MyProject में संदर्भित है/urls.py)

मुझे लगता है कि यहां चिकन और अंडे की तरह कुछ है लेकिन मैं यह नहीं समझ सकता कि मैं कहां गलत हूं।

from django.core.urlresolvers import reverse 
... 
LOGIN_URL=reverse('django.contrib.auth.views.login') 

अब लंबे सवाल (किस संदर्भ, क्यों मैं ऐसा चाहते हैं):

साथ Django 1.3.1 मैं काम कर रहा मुझे लगता है कि एक ही त्रुटि के साथ की तरह settings.py में LOGIN_URL सेट करने का प्रयास

@login_required 
def my_view(request) 
    pass 

यह डेकोरेटर डिफ़ॉल्ट (मेरे लिए यह काम करता है और वह ठीक)/लेखा/लॉगिन करने के लिए पुन: निर्देशित: निम्न दृश्य, auth.decorator के साथ सुरक्षित हो गया।

developpement सर्वर का उपयोग कर पूरे यूआरएल स्थानीय होस्ट के सापेक्ष हैं:/

उत्पादन सर्वर (WSGI का प्रयोग करके), पूरे यूआरएल मेरी-सर्वर के सापेक्ष हैं में:/path1/ यह अपाचे विन्यास के कारण है कि कुछ ऐसा कहें: WSGIScriptAlias ​​/ path1 /var/www/path/to/script.wsgi

और यह मेरे लिए ठीक है।

myproject/urls.py में परिभाषित सभी यूआरएल स्वचालित रूप से इस नए पथ से संबंधित हैं, इसलिए django के लिए धन्यवाद, मेरी सभी साइट इस नए "एचटीएमएल रूट" पर काम कर रही है।

लेकिन मेरी संरक्षित दृश्य अभी भी मेरी-सर्वर पर रीडायरेक्ट:/लेखा/लॉगिन/बजाय मेरी सर्वर ओ:/path1/लेखा/के लिए लॉग इन

अब तक मैं इसे का उपयोग कर काम करने के settings.py

LOGIN_URL=/path1/accounts/login/ 

या LOGIN_URL पैरामीटर का उपयोग करने की "login_required" डेकोरेटर:

@login_required(login_url="/path1/accounts/login/") 

लेकिन मैं चाहती हूं "path1" को विन्यस्त बिना कि इस लॉगिन दृश्य पूरी साइट पथ के सापेक्ष दोनों अपाचे में और django/settings.py

मुझे नहीं लगता कि सेटिंग्स.py में रिवर्स का उपयोग करना और न ही इसे देखने वाले सजावट में उपयोग करना सही है। लेकिन अब तक मैं यह कैसे संभाल करने के लिए नहीं पता ...

+0

क्या आप अपना urls.py पोस्ट कर सकते हैं? –

+0

क्या आपके पास वास्तव में 'my-view2' के रूप में परिभाषित दृश्य है? यह वैध पायथन नाम नहीं है, '' एक ऑपरेटर होने के नाते। यदि आप करते हैं, तो आपको इसे 'my_view2' पर पुनर्नामित करना चाहिए। – brutasse

उत्तर

13

आप login_required डेकोरेटर में या settings.py में reverse उपयोग नहीं कर सकते, क्योंकि URL config समय सेटिंग्स/विचार हैं पर लोड नहीं की गई आयात किया।

Django 1.4+ में, आप reverse_lazy का उपयोग कर सकते हैं।Django के पुराने संस्करणों पर, आप reverse_lazy का बैकपोर्ट कर सकते हैं, या reverse url mapping in settings पर सवाल का जवाब देख सकते हैं।

Django 1.5+ में, LOGIN_URL सेटिंग यूआरएल पैटर्न नाम स्वीकार करता है। उदाहरण के लिए, यदि आप अपना लॉगिन URL पैटर्न नाम 'के लिए लॉग इन' है, तो आप बस कर सकते हैं:

LOGIN_URL = 'login' 
+0

आपके सटीक उत्तर के लिए धन्यवाद! आपके द्वारा दिया गया विकल्प दिलचस्प है। यह जानना कि संस्करण 1.3.1 में यह संभव नहीं है, मैं इसे काम करने की कोशिश करने में कुछ समय बचाऊंगा! – rhn

+0

यहां पिछले संस्करणों के लिए एक स्निपेट है: http://djangosnippets.org/snippets/499/ –

+0

धन्यवाद। मैं अपने स्वयं के सजावटी बनाने के इस मुद्दे में भाग गया और यह सुनिश्चित करना था कि उसने 'reverse_lazy (...) 'के मूल्यांकन को मजबूर नहीं किया है। – cloudrave

0

निम्नलिखित रिवर्स() फ़ंक्शन, मैं एक और तरीका है अपने लक्ष्य को प्राप्त करने के लिए यह पता लगाने:

मैं मानक यूआरएल (खाते/लॉगिन, इत्यादि) का उपयोग करने के ठीक ठीक है, मैं सिर्फ HTML दस्तावेज़ रूट को पूर्ववत करना चाहता हूं जो मेरे मामले में "/" नहीं है।

अपने परीक्षण से

, यह मेरा views.py में settings.py में काम नहीं करता है (यह भी इस चरण में जल्दी है?)

:

@login_required(login_url="/path1/accounts/login/") 

बन

from django.core.urlresolvers import get_script_prefix 
@login_required(login_url=get_script_prefix() + "accounts/login/") 
+1

आप यूआरएल को हार्डकोड कर रहे हैं, यह DRY का उल्लंघन करता है! –

0

reverse_lazy()

documents कहें:

यह तब उपयोगी होता है जब आपको अपने प्रोजेक्ट के यूआरएल को लोड होने से पहले यूआरएल रिवर्सल का उपयोग करने की आवश्यकता होती है। कुछ सामान्य मामले जहां यह फ़ंक्शन आवश्यक है:

  • एक सामान्य क्लास-आधारित दृश्य के यूआरएल विशेषता के रूप में एक उल्टा यूआरएल प्रदान करता है।
  • एक सजावटी (जैसे django.contrib.auth.decorators.permission_required() सजावट के लिए login_url तर्क) को एक उलटा यूआरएल प्रदान करना।
  • किसी फ़ंक्शन के हस्ताक्षर में पैरामीटर के लिए एक डिफ़ॉल्ट मान के रूप में एक उल्टा URL प्रदान करता है।
संबंधित मुद्दे