Bagaimana cara meningkatkan Respons Terlarang di Django

168

Saya ingin melakukan hal berikut:

raise HttpResponseForbidden()

Tapi saya mendapatkan kesalahan:

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

Bagaimana saya harus melakukan ini?

ocoutts
sumber

Jawaban:

183

Kembalikan dari tampilan seperti respons lainnya.

from django.http import HttpResponseForbidden

return HttpResponseForbidden()
Ignacio Vazquez-Abrams
sumber
30
Mengapa ada kelas pengecualian Http404tetapi tidak Http403? Mengapa tidak konsisten?
Flimm
@Flimm stackoverflow.com/questions/3297048/... Saya tidak yakin tentang Django, tetapi Kerangka Django REST memiliki: dari rest_framework status status impor.HTTP_403_FORBIDDEN 403
David Watson
15
Sebenarnya menggunakan raise PermissionDeniedmemiliki keuntungan dengan membiarkan Anda menampilkan tampilan 403 khusus
guival
376

jika Anda ingin mengajukan pengecualian, Anda dapat menggunakan:

from django.core.exceptions import PermissionDenied

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

Itu didokumentasikan di sini:

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

Berlawanan dengan returing HttpResponseForbidden, meningkatkan PermissionDeniedmenyebabkan kesalahan yang akan dirender menggunakan 403.htmltemplat, atau Anda dapat menggunakan middleware untuk menampilkan tampilan "Terlarang" khusus.

Chris
sumber
2
Bisakah kita menambahkan pesan khusus di PermissionDenied?
AJ
2
Jack, ya Anda bisa - melakukan sesuatu seperti: meningkatkan PermissionDenied ("Tidak ada pengguna yang login")
Mark Chackerian
1
Tidak yakin apakah itu penting, tetapi dokumen mengatakan throw PermissionDeniedbukan sebagai pemanggilan fungsi, tanpa ()pada akhirnya.
Fydo
2
Apa keuntungan menggunakan ini daripada HttpResponseForbidden?
Flimm
3
@Flimm: Ini secara otomatis memicu 403 pada tingkat middleware, memungkinkan Anda untuk menampilkan tampilan "Terlarang" khusus Anda.
Rusak Organik
11

Anda secara opsional dapat menyediakan templat khusus bernama "403.html" untuk mengontrol rendering 403 kesalahan HTTP.

Seperti yang ditunjukkan dengan benar oleh @ dave-halter, template 403 hanya dapat digunakan jika Anda meningkatkan PermissionDenied

Di bawah ini adalah contoh tampilan yang digunakan untuk menguji templat khusus "403.html", "404.html" dan "500.html"; pastikan untuk mengatur DEBUG = Salah dalam pengaturan proyek atau kerangka kerja akan menunjukkan traceback untuk 404 dan 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)
Mario Orlandi
sumber
2
Ini tidak bekerja. Templat 403 hanya dapat digunakan jika Anda meningkatkan PermissionDenied.
Dave Halter
Terima kasih @ dave-halter, Anda benar. Saya memperbarui komentar saya untuk memperbaikinya.
Mario Orlandi
2

Coba Cara ini, mengirim pesan dengan Kesalahan

from django.core.exceptions import PermissionDenied
raise PermissionDenied("You do not have permission to Enter Clients in Other Company, Be Careful")
Saad Mirza
sumber