4

私はそのようなものを持つ方法を探しています:

return HttpResponseForbiddenRedirect(reverse("view_name"))

ビューに (その名前で) リダイレクトするが、それでも 403 エラーをスローする HttpResponse

私はそのようなことをしようとしました:

class HttpResponseForbiddenRedirect(HttpResponse):
    def __init__(self, redirect_to):
        super(HttpResponseForbiddenRedirect, self).__init__()
        self['Location'] = iri_to_uri(redirect_to)
        self.status_code = 403

しかし、うまくいきませんでした。どういうわけか、私は理解していません、私は内容を得ません

4

3 に答える 3

9

403応答を作成することはできず、302応答であるかのように処理されるため、機能しません。

HTTP仕様は、特定のステータスコードの処理方法をブラウザに指示するため、403を取得するブラウザは、302の場合と同じようにLocationヘッダーがあるかどうかをわざわざ確認する必要はありません。

Xの表示が許可されていないために誰かをXからYにリダイレクトする場合は、標準の302を発行し、メッセージを設定する(django.contrib.messagesを使用)などして、ユーザーに理由を通知します。リダイレクトされたか、何が起こっているのかを説明するページにリダイレクトされました。

于 2012-07-04T08:19:16.540 に答える
1

私はこれに対する解決策を見つけました:

from app_name.views import my_view

....
    retour = my_views(request)
    return HttpResponseForbidden(retour)

それは実際には非常に簡単です

そして、403エラーとロードしたいページが表示されます

于 2012-07-04T09:09:12.707 に答える
1

HTTP ステータス コードの背後にあるアイデアがありません。リダイレクトは HTTP コード 301/302 で行われています。そのため、リダイレクトとリターン 403 を同時に行うことはできません。301/302 コードが返されない場合は、単にリダイレクトではありません。

なぜこれが必要なのかわかりませんが、いつでも次のようなビューを作成できます。

def my403view(request): # e.g. /403.html
    return HttpResponseForbidden()

リダイレクトを行うには:

return HttpResponseRedirect(reverse("403.html"))

これにより、(コード 302 で) "my403view" にリダイレクトされ、403 が返されます。

于 2012-07-04T08:16:26.047 に答える