2015-06-30 7 views
7

में विभिन्न लॉगिन दृश्य मेरे कुछ पिरामिड एप्लिकेशन द्वारा प्रबंधित किए गए कुछ यूआरएल हैं। एक अप्रमाणित उपयोगकर्ता किसी भी यूआरएल तो उपयोगकर्ता के लिए लॉग इन करने के लिए प्रपत्र रीडायरेक्ट हो गई है खोलने के लिए प्रयास करता है:पिरामिड

def forbidden(request): 
    if request.user.keyname == 'guest': 
     return HTTPFound(location=request.route_url('auth.login',)) 

    request.response.status = 403 
    return dict(subtitle=u"Access denied") 

config.add_view(forbidden, context=HTTPForbidden, renderer='auth/forbidden.mako') 

लेकिन कुछ URL (रूट) मुझे नहीं लॉगिन प्रपत्र वापस जाने के लिए है के लिए है, लेकिन WWW-Authenticate हेडर के साथ एक 401 Unauthorized status code। मैं इसे पूरा करने के लिए अपने मार्ग कैसे स्थापित कर सकता हूं? मुझे लगता है कि मुझे route_predicate का उपयोग करना है।

+2

कुछ दृश्यों के लिए आप यहां वर्णित HTTPUnuthorized क्यों नहीं लौट सकते हैं [http://docs.pylonsproject.org/projects/pyramid//en/latest/narr/views.html#http-exceptions) इस तर्क की जरूरत है? –

उत्तर

4

आप उन दो त्रुटियों को अपने कस्टम में लपेट सकते हैं, और दोनों को जगह में उठा सकते हैं। फिर आप अपने अपवाद को संभाल सकते हैं और प्रत्येक त्रुटि के लिए वांछित परिदृश्य चला सकते हैं।

class YourError(HTTPException): 
    def __init__(self, error): 
     super(YourError, self).__init__() 

     self.error = error 

    def handle(self, request): 
     if error is HTTPForbidden or is instance(error, HTTPForbidden): 
      return self._handle403(request) 
     elif error is HTTPUnauthorized or is instance(error, HTTPUnauthorized): 
      return self._handle401(request) 

    def _handle403(self, request): 
     # do your stuff for 403 

    def _handle401(self, request): 
     # do your stuff for 401 

# ...modify your view 
def forbidden(context, request): 
    return context.handle(request) 

फिर अपने दृश्य विन्यास को संपादित: यहाँ एक उदाहरण है

def another_view(request) 
    ... 
    raise YourError(HTTPForbidden) 
    # or 
    raise YourError(HTTPUnauthorized) 
    ... 

:

config.add_view(forbidden, context=YourError, renderer='auth/forbidden.mako') 

और फिर अन्य दृश्यों जहां 403 या 401 वापस जाने के लिए की जरूरत है, इस तरह से जाना फिर आपको केवल YourError कक्षा के अंदर अपने हैंडलिंग तर्क को लागू करने की आवश्यकता होगी।

1

मैं कुछ discussion on the Pyramid issues list पर आया जो ऐसा लगता है कि यह इस समस्या का समाधान कर सकता है।

यह कहा गया कि, मुझे लगता है कि आप क्या कर सकते हैं hooks का उपयोग करके फोरबिडन व्यू को ओवरराइड करें और एक कस्टम अपवाद हैंडलर बनाएं। फिर वहां मुझे लगता है कि आप 403 और 401 त्रुटियों के बीच अंतर कर सकते हैं और उचित प्रतिक्रिया संदेश को रीडायरेक्ट/प्रदर्शित कर सकते हैं और आपको आवश्यक प्रतिक्रिया को कस्टमाइज़ कर सकते हैं।

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