2012-03-27 30 views
5

Tác vụ: Khi xảy ra lỗi trong một trong các chế độ xem của tôi, tôi cần hiển thị chế độ xem lỗi tùy chỉnh. Loại lỗi không quan trọng.Kim tự tháp (Python): Ghi đè chế độ xem lỗi mặc định

Tôi cố gắng để ghi đè lên tất cả các trường hợp ngoại lệ bởi registring một cái nhìn cho tất cả các trường hợp ngoại lệ, như thế này:

<view 
    context="Exception" 
    renderer="server_error.pt" 
    /> 

Nó làm việc tốt. Tất cả các ngoại lệ đều cho thấy quan điểm của tôi. Nhưng vấn đề là những lỗi này đã ngừng ghi nhật ký. Của cource tôi có thể làm một cái gì đó như logger.error (traceback) trong xem lỗi của tôi, nhưng đây là một ý tưởng câm.

Làm cách nào tôi có thể đăng ký chế độ xem cho tất cả các lỗi mà không phá vỡ hệ thống kim tự tháp đăng nhập.

+0

Bạn phải tự mình đăng nhập lỗi hoặc sửa lỗi. Nếu bạn reraise lỗi nó sẽ đăng nhập nhưng sẽ không làm cho xem của bạn. Nếu bạn đăng nhập lỗi trong chế độ xem của mình, nó sẽ ghi lại và hiển thị chế độ xem của bạn. –

Trả lời

2

Bạn có thể ghi nhật ký lỗi trong chế độ xem của mình qua nhật ký trăn cũ đồng bằng. Hoặc Đặt trạng thái trên phản hồi thành 500 (giả sử chế độ xem của bạn hiện trả lại trạng thái 200 cho biết phản hồi thành công).

Edit: làm việc ví dụ

Tôi không phải là một chuyên gia về khai thác gỗ, nhưng tôi đã có ấn tượng rằng cấu hình đăng nhập của bạn trong development.ini/production.ini sẽ được nhặt, ví dụ dưới đây dường như để chứng minh rằng nhưng bạn được các thẩm phán .....

thay đổi đăng nhập cấu hình từ mặc định

[formatter_generic] 
# format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s 
format = y u no work??!!?? %(message)s 
# End logging configuration 

quan điểm

from pyramid.view import view_config 
from webob import Response 
import logging 
log = logging.getLogger(__name__) 

@view_config(route_name='home', renderer='templates/mytemplate.pt') 
def my_view(request): 
    raise ValueError("oops") 
    return {'project':'tstLogError'} 


@view_config(context=Exception) 
def exception_view(context, request): 
    log.error("The error was: %s" % context, exc_info=(context)) 
    return Response(status_int=500, body=str(context)) 

    from pyramid.view import view_config 
    from webob import Response 

console đầu ra:

serving on http://0.0.0.0:6543 
y u no work??!!?? The error was: oops 
Traceback (most recent call last): 
    File "/home/twillis/projects/TestLogError/local/lib/python2.7/site-packages/pyramid/tweens.py", line 20, in excview_tween 
    response = handler(request) 
    File "/home/twillis/projects/TestLogError/local/lib/python2.7/site-packages/pyramid/router.py", line 164, in handle_request 
    response = view_callable(context, request) 
    File "/home/twillis/projects/TestLogError/local/lib/python2.7/site-packages/pyramid/config/views.py", line 333, in rendered_view 
    result = view(context, request) 
    File "/home/twillis/projects/TestLogError/local/lib/python2.7/site-packages/pyramid/config/views.py", line 471, in _requestonly_view 
    response = view(request) 
    File "/home/twillis/projects/TestLogError/tstLogError/tstlogerror/views.py", line 8, in my_view 
    raise ValueError("oops") 
ValueError: oops 

browser screenshot

+0

Như tôi đã nói: Đăng nhập với trình ghi cơ sở là một giải pháp tồi. Nếu tôi làm điều đó tôi không thể đăng nhập nó với cấu hình của kim tự tháp. Tôi đã thử cài đặt mã statatus, nhưng nó không thay đổi tình trạng đăng nhập (vẫn không có lỗi). –

+0

vì vậy những gì bạn đang nói là khi bạn nhấn chế độ xem đó với trình duyệt của mình, trình duyệt của bạn sẽ thấy HTTP_STATUS = 500 nhưng trình duyệt không được ghi lại? Điều đó thật đáng ngạc nhiên. Id phải nhìn thấy nó để tin điều đó. –

+0

Dou! Trong ví dụ của bạn, bạn tự mình đăng nhập :). nó được hiển thị với 'y u no work ?? !! ??' là vì bạn đã thay đổi cấu hình trình định dạng, được áp dụng trên tất cả đầu ra cho sys.error. Nhưng vẫn cảm ơn! Bây giờ tôi hiểu rằng không có cách nào khác, hơn là tự mình đăng nhập và trình định dạng được áp dụng, do đó, có vẻ như đó không phải là vấn đề –

2

Nó không phải là câm để đăng nhập trừ theo quan điểm lỗi của riêng bạn (. Ngoại trừ sẽ có sẵn như request.context) Như mọi khi là trường hợp với trường hợp ngoại lệ, bạn có thể không làm gì cả, xử lý ngoại lệ và ghi lại ngoại lệ hoặc tăng lại cùng một ngoại lệ.

Trong thiết lập của tôi, một ngoại lệ chưa được tự động được ghi lại bởi chính máy chủ WSGI, trong trường hợp này là wsgiref. Không thể kích hoạt cả cơ chế phản hồi bình thường của máy chủ WSGI và trình ghi nhật ký ngoại lệ của máy chủ WSGI. logger ngoại lệ

wsgiref của:

def log_exception(self,exc_info): 
    """Log the 'exc_info' tuple in the server log 

    Subclasses may override to retarget the output or change its format. 
    """ 
    try: 
     from traceback import print_exception 
     stderr = self.get_stderr() 
     print_exception(
      exc_info[0], exc_info[1], exc_info[2], 
      self.traceback_limit, stderr 
     ) 
     stderr.flush() 
    finally: 
     exc_info = None 

Một thay thế có thể chấp nhận được đối với bạn là để hiển thị trang lỗi tùy chỉnh của bạn tại lớp máy chủ web thay vì ở lớp Pyramid.

+0

Cảm ơn câu trả lời. Có vẻ như tôi sẽ chỉ đăng nhập vào bên trong khung nhìn. –

0

Plugin pyramid_exclog điền vào mục đích này rất tốt.

Nó được thực hiện như một tween để bạn vẫn có thể viết một cái nhìn cho Exception và nó sẽ ghi lại các chi tiết của ngoại lệ cho bất kỳ trình xử lý nhật ký nào bạn chỉ định trong tệp cấu hình kim tự tháp của bạn - thời tiết cho bảng điều khiển, tệp hoặc email.

Ngoài tài liệu pyramid_exclog tôi cũng tìm thấy phần Python Configuration file format của tài liệu Python rất hữu ích vì cấu hình này khá phức tạp để có được quyền.

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