ฉันจะเพิ่มการตอบสนองต้องห้ามใน 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

@Flimm stackoverflow.com/questions/3297048/…ฉันไม่แน่ใจเกี่ยวกับ Django แต่ Django REST Framework มี: จาก rest_framework สถานะสถานะการนำเข้าที่เหลือ HTTP_403_FORBIDDEN 403
David Watson

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

การHttpResponseForbiddenเพิ่มPermissionDeniedเป็นสาเหตุให้เกิดข้อผิดพลาดในการแสดงผลโดยใช้403.htmlแม่แบบหรือคุณสามารถใช้มิดเดิลแวร์เพื่อแสดงมุมมอง "ต้องห้าม" ที่กำหนดเอง


2
เราสามารถเพิ่มข้อความที่กำหนดเองใน PermissionDenied ได้หรือไม่
AJ

2
แจ็คใช่คุณทำได้ - ทำสิ่งที่ชอบ: เพิ่ม PermissionDenied ("ไม่มีผู้ใช้ที่ลงชื่อเข้าใช้")
Mark Chackerian

1
ถ้าไม่แน่ใจว่ามันเป็นเรื่องสำคัญ แต่เอกสารกล่าวว่าthrow PermissionDeniedไม่ได้เป็นสายฟังก์ชั่นโดยไม่ต้อง()ในตอนท้าย
Fydo

2
อะไรคือข้อดีของการใช้สิ่งนี้ผ่าน HttpResponse Forbidden?
Flimm

3
@Flimm: สิ่งนี้จะทริกเกอร์ 403 ที่ระดับมิดเดิลแวร์โดยอัตโนมัติช่วยให้คุณแสดงมุมมอง "ห้าม" ที่กำหนดเอง
ทำลายออ

11

คุณสามารถเลือกที่จะจัดหาเทมเพลตแบบกำหนดเองที่ชื่อว่า"403.html"เพื่อควบคุมการแสดงผลข้อผิดพลาด HTTP 403

ตามที่ระบุอย่างถูกต้องโดย @ 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 คุณพูดถูก ฉันอัปเดตความคิดเห็นของฉันเพื่อแก้ไข
Mario Orlandi

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.