2012-04-05 19 views
11

वापस जाने के लिए कुछ दृश्यों लेखन ajax अनुरोध मैं यह कुछ हद तक अजीब login_required डेकोरेटर हमेशा नहीं प्रमाणीकृत उपयोगकर्ताओं के लिए एक 302 स्थिति कोड लौटाने कि खोजने के लिए प्रतिक्रिया करने के लिए है। चूंकि ये विचार अजाक्स विचार हैं, यह कुछ हद तक अनुचित लगता है। मैं नहीं चाहता कि उपयोगकर्ता इस तरह के मामले में लॉग इन करना चाहता है, लेकिन मैं चाहता हूं कि Django क्लाइंट को यह बताने के लिए कि इस तरह के दृश्य तक पहुंचने के लिए प्रमाणीकरण की आवश्यकता है (एक 401 सही स्थिति कोड होना चाहिए, मुझे लगता है)।login_required डेकोरेटर 401 के बजाय 302

इस लक्ष्य को हासिल करने के लिए, मैं अपने डेकोरेटर login_required_ajax लिखना शुरू किया है, लेकिन किसी भी तरह इस अपने कौशल से परे है। यह वही है मैं अब तक के साथ आए हैं है:

def login_required_ajax(function=None,redirect_field_name=None): 
    """ 
    Just make sure the user is authenticated to access a certain ajax view 

    Otherwise return a HttpResponse 401 - authentication required 
    instead of the 302 redirect of the original Django decorator 
    """ 
    def _decorator(view_func): 
     def _wrapped_view(request, *args, **kwargs): 
      if request.user.is_authenticated(): 
       return view_func(request, *args, **kwargs) 
      else: 
       return HttpResponse(status=401) 

     if function is None: 
      return _decorator 
     else: 
      return _decorator(function) 

एक दृश्य पर इस डेकोरेटर का उपयोग कर, मैं जैसे ही मैं साइट पर किसी भी पेज तक पहुँचने का प्रयास एक ViewDoesNotExist अपवाद मिलता है।

मैं पहली बार सोचा था कि समस्या, एक HttpResponse जब कोई उपयोगकर्ता प्रमाणीकृत नहीं है की प्रत्यक्ष वापसी हो सकता है क्योंकि एक प्रतिक्रिया वस्तु एक प्रतिदेय नहीं है। लेकिन तब सजावटी को तब तक काम करना चाहिए जब तक मैं प्रश्न में दृश्य तक पहुंचने की कोशिश नहीं करता, है ना? और यदि यह वास्तव में क्रूक्स है, तो मैं एक सजावट कैसे लिख सकता हूं जो 401 के स्टेटस कोड के साथ एक HttpResponse देता है?

+1

एक विचार है कि अपने निर्देशक के बारे में नहीं है: आप भी एक मध्यस्थ है, जो की जाँच करता है अगर एक अनुरोध एक ajax अनुरोध है और देता है एक '401 को पेश कर सकता 'अगर यह पता लगाता है कि दृश्य देता है प्रवेश के लिए एक' 302' ... तो तुम Django के डेकोरेटर का उपयोग कर रखने के लिए और ajax और सामान्य अनुरोध अलग संभाल सकता ... –

+3

कि करता है वास्तव में की तुलना में आप के लिए सरल ध्वनि: "एक कस्टम डेकोरेटर बनाएँ और AJAX विचारों पर इसका उपयोग करें "? ;) – marue

उत्तर

14

एक बहुत अच्छा प्रयास है कि। यहां कुछ समस्याएं देखी गई हैं:

  1. आपका _decorator फ़ंक्शन _wrapped_view वापस करना चाहिए।
  2. खरोज अपने if function is None ब्लॉक के लिए एक सा बंद है - login_required_ajax समारोह सजाया समारोह वापस जाने के लिए की जरूरत है।

यहाँ किए गए परिवर्तनों के साथ डेकोरेटर है:

def login_required_ajax(function=None,redirect_field_name=None): 
    """ 
    Just make sure the user is authenticated to access a certain ajax view 

    Otherwise return a HttpResponse 401 - authentication required 
    instead of the 302 redirect of the original Django decorator 
    """ 
    def _decorator(view_func): 
     def _wrapped_view(request, *args, **kwargs): 
      if request.user.is_authenticated(): 
       return view_func(request, *args, **kwargs) 
      else: 
       return HttpResponse(status=401) 
     return _wrapped_view 

    if function is None: 
     return _decorator 
    else: 
     return _decorator(function) 
+0

एक आकर्षण की तरह काम करता है। धन्यवाद। – marue

संबंधित मुद्दे