10

このコードを見ると:

try:
   ...  # do something
except:
   raise Exception('XYZ has gone wrong...')

であっても、これでイエローページを表示しDEBUG=Trueたくありませんが、そうです。raise Exception

ユーザーをエラーページにリダイレクトするか、エラーを表示して例外を処理したい (ページの上部に CSS エラーメッセージを表示する...)

どうすればそれを処理できますか?単純に上げると、黄色のデバッグ ページが表示されます (ここでも、DEBUG=True のときにデバッグ ページを表示することで、特定の例外によってサイトの機能が停止することは望ましくありません)。

views.py でこれらの例外を処理するにはどうすればよいですか?

4

4 に答える 4

21

ここには 3 つのオプションがあります。

  1. 404 ハンドラーまたは 500 ハンドラーを提供する
  2. コードの他の場所で例外をキャッチし、適切なリダイレクトを行います
  3. process_exception実装済みのカスタム ミドルウェアを提供する

ミドルウェアの例:

class MyExceptionMiddleware(object):
    def process_exception(self, request, exception):
        if not isinstance(exception, SomeExceptionType):
            return None
        return HttpResponse('some message')
于 2012-06-05T01:16:54.477 に答える
4

404 エラーを発生させるか、ユーザーをカスタム エラー ページにリダイレクトして、エラー メッセージを表示することができます。

from django.http import Http404
#...
def your_view(request)
    #...
    try:
        #... do something
    except:
        raise Http404
        #or
        return redirect('your-custom-error-view-name', error='error messsage')
  1. ジャンゴ 404 エラー
  2. Django リダイレクト
于 2012-06-05T01:16:12.107 に答える
1

もう 1 つの提案は、エラー ページの代わりに、 Django メッセージング フレームワークを使用してフラッシュ メッセージを表示することです。

from django.contrib import messages
#...
def another_view(request):
    #...
    context = {'foo': 'bar'}
    try:
        #... some stuff here
    except SomeException as e:
        messages.add_message(request, messages.ERROR, e)

    return render(request, 'appname/another_view.html', context)

そして、Django ドキュメントのようなビューで:

{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
</ul>
{% endif %}
于 2016-10-25T08:48:39.963 に答える