2015-06-30 20 views
7

Có một số URL được ứng dụng Pyramid của tôi xử lý. Khi người dùng không được thẩm định cố gắng để mở bất kỳ URL sau đó người dùng sẽ được chuyển hướng vào ô đăng nhập:Các chế độ xem đăng nhập khác nhau trong Pyramid

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

Nhưng đối với một số url (đường) Tôi phải trả lại không phải là hình thức đăng nhập, nhưng một 401 Unauthorized status code với WWW-Authenticate tiêu đề. Làm thế nào tôi có thể thiết lập các tuyến đường của tôi để thực hiện điều này? Tôi đoán rằng tôi phải sử dụng route_predicate.

+2

Tại sao bạn không thể đơn giản trả về HTTPUnauthorized như được mô tả [ở đây] (http://docs.pylonsproject.org/projects/pyramid//en/latest/narr/views.html#http-exceptions) cho một số chế độ xem cần logic này? –

Trả lời

4

Bạn có thể bọc hai lỗi đó vào tùy chỉnh của mình và tăng hai lỗi đó vào vị trí của cả hai. Sau đó, bạn có thể xử lý ngoại lệ của mình và chạy kịch bản mong muốn cho từng lỗi. Dưới đây là một ví dụ:

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) 

Sau đó chỉnh sửa cấu hình xem của bạn:

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

Và sau đó trong quan điểm khác mà bạn cần phải trả lại 403 hoặc 401, đi theo cách này:

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

Sau đó, bạn sẽ chỉ cần triển khai logic xử lý của mình bên trong lớp YourError.

1

Tôi đã xem qua một số discussion on the Pyramid issues list có vẻ như nó có thể giải quyết vấn đề này.

Điều đó nói rằng, tôi nghĩ rằng những gì bạn có thể làm là ghi đè chế độ xem Cấm sử dụng hooks và tạo trình xử lý ngoại lệ tùy chỉnh. Sau đó, tôi nghĩ bạn có thể phân biệt giữa các lỗi 403401 và chuyển hướng/hiển thị thông báo phản hồi thích hợp và tùy chỉnh phản hồi theo bất kỳ cách nào bạn cần.

Các vấn đề liên quan