2015-06-30 26 views
7

Piramid uygulamam tarafından işlenen bazı URL'ler vardır. Kimliği doğrulanmamış bir kullanıcının sonra kullanıcı giriş formunu yönlendirilir herhangi bir URL açmak çalıştığında: Piramit uygulamasındaki farklı giriş görünümleri

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') 

Ama ben giriş formunu dönmek zorunda bazı URL'ler (yolları) için

fakat WWW-Authenticate başlığıyla bir 401 Unauthorized status code. Bunu gerçekleştirmek için rotalarımı nasıl kurabilirim? route_predicate'u kullanmam gerektiğini tahmin ediyorum.

+2

Niçin basitçe HTTP'ye geri döndüğünüzde, bazı görünümler için [burada] (http://docs.pylonsproject.org/projects/pyramid//en/latest/narr/views.html#http-exceptions) açıklandığı gibi Bu mantığa ihtiyacı var mı? –

cevap

4

Bu iki hatayı, özel dosyanıza sarın ve bunu her ikisinin yerine yükseltebilirsiniz. Sonra istisnayı halledebilir ve her bir hata için istenen senaryoyu çalıştırabilirsiniz.

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) 

Sonra görünümü yapılandırmasını düzenlemek: İşte bir örnek

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

: Eğer 403 veya 401 dönmek gerekir diğer görünümlerde sonra

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

Ve bu şekilde gitmek Daha sonra sadece işleme mantığınızı YourError sınıfında uygulamanız gerekecektir.

1

Bu soruna hitap edebilecek gibi görünen bazı discussion on the Pyramid issues list numaralı ürünlere rastladım.

Yapacağınız şey, hooks kullanarak Yasak görünümünü geçersiz kılmak ve özel bir özel durum işleyici oluşturmak olduğunu düşünüyorum. O zaman orada ben 403 ve 401 hataları arasında ayrım ve uygun bir yanıt mesajını yönlendirmek/görüntülemek ve ihtiyacınız olan cevabı özelleştirmek olabilir düşünüyorum.

İlgili konular