Django'da yasak bir yanıtı nasıl yükseltebilirim?


168

Aşağıdakileri yapmak istiyorum:

raise HttpResponseForbidden()

Ama hatayı alıyorum:

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

Bunu nasıl yapmalıyım?

Yanıtlar:


183

Diğer yanıtlarda yaptığınız gibi görünümden döndürün.

from django.http import HttpResponseForbidden

return HttpResponseForbidden()

30
Neden bir istisna sınıfı var Http404ama yok Http403? Neden tutarsızlık?
Flimm

@Flimm stackoverflow.com/questions/3297048/… Django hakkında emin değilim, ancak Django REST Framework şunları içeriyor: rest_framework içe aktarma durumu durumundan.HTTP_403_FORBIDDEN 403
David Watson

15
Aslında kullanma raise PermissionDeniedözel 403 görünümünüzü göstermenize izin verme avantajına sahiptir
guival

376

bir istisna oluşturmak istiyorsanız şunları kullanabilirsiniz:

from django.core.exceptions import PermissionDenied

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

Burada belgelenmiştir:

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

Geri çekilmenin aksine HttpResponseForbidden, yükseltme şablonu PermissionDeniedkullanarak hatanın oluşturulmasına neden olur 403.htmlveya özel bir "Yasak" görünümü göstermek için ara katman yazılımını kullanabilirsiniz.


2
PermissionDenied'e özel bir mesaj ekleyebilir miyiz?
AJ

2
Jack, evet yapabilirsin - şöyle bir şey yap:
yükselt

1
Önemli olup olmadığından emin değilim, ancak dokümanlar sonunda throw PermissionDeniedbir işlev çağrısı olarak değil ().
Fydo

2
Bunu HttpResponseForbidden yerine kullanmanın avantajı nedir?
Flimm

3
@Flimm: Bu, özel "Yasak" görünümünüzü göstermenize izin vererek 403'ü ara katman yazılımı düzeyinde otomatik olarak tetikler.
Hasarlı Organik

11

403 HTTP hatasının oluşturulmasını denetlemek için isteğe bağlı olarak "403.html" adlı özel bir şablon da sağlayabilirsiniz .

@ Dave-halter tarafından doğru bir şekilde belirtildiği gibi, 403 şablonu yalnızca PermissionDenied öğesini yükseltirseniz kullanılabilir

Aşağıda, "403.html", "404.html" ve "500.html" özel şablonlarını test etmek için kullanılan örnek bir görünüm bulunmaktadır; lütfen proje ayarlarında DEBUG = False ayarını yaptığınızdan emin olun, aksi takdirde çerçeve 404 ve 500 yerine bir geri izleme gösterir.

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
Bu çalışmıyor. 403 şablonu yalnızca PermissionDenied öğesini yükseltirseniz kullanılabilir.
Dave Halter

Teşekkürler @ dave-halter, haklısın. Düzeltmek için yorumumu güncelledim.
Mario Orlandi

2

Hata ile mesaj göndererek bu şekilde deneyin

from django.core.exceptions import PermissionDenied
raise PermissionDenied("You do not have permission to Enter Clients in Other Company, Be Careful")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.