2012-05-13 2 views
2

Есть ли способ поймать Django's handle_uncaught_exception и каким-то образом перенаправить ошибку через представления?Reroute Django's "handle_uncaught_exception"

Мы используем нашу собственную базу данных базы данных для Django. Две важные особенности бэкэнд - это то, что мы используем базу данных для получения исключений, которые мы хотим перкотировать для интерфейса, и мы предоставляем ленивый рябину с использованием namedtuples.

Когда я использую ленивого rowgetter, я не могу поймать пользовательское исключение, которое я могу сделать, когда выполняю стандартный запрос. Пример трассировку выглядит следующим образом:

ERROR Internal Server Error: /api/b-r-o-k-e-n--t-o-k-e-n/ 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 136, in get_response 
    response = response.render() 
    ...lines removed... 
    File "/usr/lib/python2.7/dist-packages/django/template/defaulttags.py", line 144, in render 
    values = list(values) 
    File "../xmlapi/model/model.py", line 80, in xmlapi_get_location_rota 
    for i in self.foldquery(query, args, slices): 
    File "../xmlapi/model/db.py", line 168, in foldquery 
    self.query(querystring, args) 
    File "../xmlapi/model/db.py", line 44, in wrapped_fn 
    raise DBException(e.message.strip()) 
DBException 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/wsgiref/handlers.py", line 85, in run 
    self.result = application(self.environ, self.start_response) 
    File "/usr/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 241, in __call__ 
    response = self.get_response(request) 
    File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 179, in get_response 
    response = self.handle_uncaught_exception(request, resolver, sys.exc_info()) 
...lines removed... 

Преимущество ленивого rowgetter в том, что она вызывается только один раз шаблон начинает оказывать (я думаю). Недостатком является то, что я не могу поймать исключение в представлении для повышения, скажем, ошибку 420: rate limit exceeded.

Из-за поздней оценки, обработчик ошибок не вызывается:

try: 
     rota = self.model.xmlapi_get_location_rota (**kwargs) 
    except DBException, e: 
     code, message = [epart.strip() for epart in e.msg.split(':')] 
     return HttpResponse(message, status=code, 
          content_type="text/plain") 

Я был бы признателен за любые мысли о попытке бросить это исключение ранее без необходимости загружать весь набор результатов.

ответ

0

Поскольку это исключение, возникшее при визуализации шаблона, исключение в настоящее время не обрабатывается в Django 1.3/1.4.

В списке разработчиков django было рекомендовано добавить возможность исключения исключения TemplateResponse в качестве запроса функции django.

Для получения более подробной информации, пожалуйста, обратитесь к Django-developers google groups email thread.

Смежные вопросы