djangoで禁止されている応答を発生させる方法


168

次のようにしたいと思います。

raise HttpResponseForbidden()

しかし、私はエラーが出ます:

exceptions must be old-style classes or derived from BaseException, not HttpResponseForbidden

どうすればよいですか?

回答:


183

他の応答と同様に、ビューからそれを返します。

from django.http import HttpResponseForbidden

return HttpResponseForbidden()

30
例外クラスHttp404が存在するのになぜ存在しないのHttp403ですか?なぜ矛盾があるのですか?
Flimm 2016年

@Flimm stackoverflow.com/questions/3297048/...私はジャンゴわからないんだけど、DjangoのRESTフレームワークがあります。rest_frameworkのインポートステータスstatus.HTTP_403_FORBIDDENから403
デヴィッド・ワトソン

15
実際に使用raise PermissionDeniedすると、カスタム403ビューを表示できるという利点があります
guival

376

例外を発生させたい場合は、以下を使用できます。

from django.core.exceptions import PermissionDenied

def your_view(...):
    raise PermissionDenied()

それはここに文書化されています:

https://docs.djangoproject.com/en/stable/ref/views/#the-403-http-forbidden-view

returingとは対照的にHttpResponseForbidden、調達をPermissionDenied使用してレンダリングするとエラーになり403.htmlテンプレートを、またはカスタム「禁断」ビューを表示するためのミドルウェアを使用することができます。


2
PermissionDeniedにカスタムメッセージを追加できますか?
AJ

2
ジャック、はい、できます-次のようにしてください:raise PermissionDenied( "No
login

1
それが重要であるかどうかはわかりthrow PermissionDeniedませんが、ドキュメントには()、末尾にがないと、関数呼び出しではないと記載されています。
Fydo 2014年

2
これをHttpResponseForbiddenよりも使用する利点は何ですか?
Flimm

3
@Flimm:これにより、ミドルウェアレベルで403が自動的にトリガーされ、カスタムの「禁止」ビューを表示できます。
破損したオーガニック

11

オプションで、「403.html」というカスタムテンプレートを指定して、403 HTTPエラーのレンダリングを制御できます。

@ dave-halterによって正しく指摘されているように、403テンプレートはPermissionDeniedを発生させた場合にのみ使用できます

以下は、カスタムテンプレート「403.html」、「404.html」、「500.html」をテストするために使用されるサンプルビューです。プロジェクトの設定で必ずDEBUG = Falseを設定してください。そうしないと、フレームワークは404と500の代わりにトレースバックを表示します。

from django.http import HttpResponse
from django.http import Http404
from django.core.exceptions import PermissionDenied


def index(request):

    html = """
<!DOCTYPE html>
<html lang="en">
  <body>
    <ul>
        <li><a href="/">home</a></li>
        <li><a href="?action=raise403">Raise Error 403</a></li>
        <li><a href="?action=raise404">Raise Error 404</a></li>
        <li><a href="?action=raise500">Raise Error 500</a></li>
    </ul>
  </body>
</html>
"""

    action = request.GET.get('action', '')
    if action == 'raise403':
        raise PermissionDenied
    elif action == 'raise404':
        raise Http404
    elif action == 'raise500':
        raise Exception('Server error')

    return HttpResponse(html)

2
これは動作しません。403テンプレートは、PermissionDeniedを発生させた場合にのみ使用できます。
Dave Halter

@ dave-halter、ありがとうございます。コメントを更新して修正しました。
マリオ・オルランディ

2

この方法を試して、メッセージをエラーで送信する

from django.core.exceptions import PermissionDenied
raise PermissionDenied("You do not have permission to Enter Clients in Other Company, Be Careful")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.