Pyramid (Python): переопределить вид ошибки по умолчанию - PullRequest
5 голосов
/ 27 марта 2012

Задача: при возникновении ошибки в одном из моих представлений мне нужно показать настраиваемое представление ошибок.Тип ошибки не имеет значения.

Я попытался переопределить все исключения, зарегистрировав представление для всех исключений, например:

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

Сработало хорошо .Все исключения показывали мой взгляд.Но проблема была в том, что эти ошибки перестали регистрировать .Конечно, я могу сделать что-то вроде logger.error (traceback) в своем представлении об ошибках, но это глупая идея.

Как зарегистрировать представление для всех ошибок, не нарушая систему пирамиды протоколирования.

Ответы [ 3 ]

3 голосов
/ 27 марта 2012

Вы можете записать ошибку в своем представлении через обычную старую запись в Python. Или Установите статус ответа на 500 (при условии, что ваше представление теперь возвращает статус 200, который указывает на успешный ответ).

Редактировать: рабочий пример

Я не эксперт по ведению журнала, но у меня сложилось впечатление, что ваш конфигурационный файл журнала в development.ini / production.ini будет выбран, пример ниже, кажется, доказывает это, но вы будете судьей .... .

изменения конфигурации журнала по умолчанию

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

просмотров

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

вывод на консоль:

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

2 голосов
/ 27 марта 2012

Не глупо регистрировать исключение в своем собственном представлении об ошибке (исключение будет доступно как request.context.) Как всегда в случае с исключениями, вы можете либо ничего не делать, обрабатывать исключение и регистрировать его, либо повторно вызвать то же исключение.

В моей настройке необработанное исключение регистрируется самим сервером WSGI, в данном случае wsgiref. Невозможно запустить как обычный механизм ответа сервера WSGI, так и его регистратор исключений.

Регистратор исключений wsgiref:

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

Одной из альтернатив, которая может быть приемлема для вас, является отображение пользовательской страницы ошибок на уровне веб-сервера, а не на уровне пирамиды.

0 голосов
/ 29 декабря 2017

Плагин pyramid_exclog отлично подходит для этой цели.

Он реализован как анимация, так что вы все еще можете написать представление для Exception, и он будет записывать подробности исключения в любой обработчик журнала, указанный вами в файле конфигурации пирамиды - погода, которая находится на консоли, файл или электронное письмо.

В дополнение к документации pyramid_exclog я также нашел раздел Python Формат файла конфигурации в документации Python очень полезным, поскольку конфигурация довольно сложна для понимания.

...