2

Django をキャッチhandle_uncaught_exceptionして、何らかの方法でビューを介してエラーを再ルーティングする方法はありますか?

Django には独自のデータベース バックエンドを使用しています。バックエンドの 2 つの重要な機能は、データベースを使用して、フロントエンドに浸透させたい例外を発生させることと、namedtuples を使用して遅延行ゲッターを提供することです。

怠惰な行ゲッターを使用すると、カスタム例外をキャッチできません。これは、標準クエリを実行するときに実行できます。バックトレースの例は次のとおりです。

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...

怠惰な行ゲッターの利点は、テンプレートのレンダリングが開始されたときにのみ呼び出されることです (私は思います)。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")

結果セット全体をロードすることなく、この例外を早期にスローしようとする考えに感謝します。

4

1 に答える 1

0

これはテンプレートがレンダリングされるときに発生する例外であるため、現在 Django 1.3/1.4 では例外を処理できません。

django-developers リストでは、TemplateResponse 例外をキャッチする機能を django 機能要求として追加することが推奨されています。

詳細については、Django-developers の Google グループのメール スレッドを参照してください。

于 2012-06-07T21:53:53.367 に答える