ฉันต้องการทำสิ่งต่อไปนี้:
raise HttpResponseForbidden()
แต่ฉันได้รับข้อผิดพลาด:
exceptions must be old-style classes or derived from BaseException, not HttpResponseForbidden
ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันต้องการทำสิ่งต่อไปนี้:
raise HttpResponseForbidden()
แต่ฉันได้รับข้อผิดพลาด:
exceptions must be old-style classes or derived from BaseException, not HttpResponseForbidden
ฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
ส่งคืนจากมุมมองตามที่คุณต้องการการตอบสนองอื่น ๆ
from django.http import HttpResponseForbidden
return HttpResponseForbidden()
raise PermissionDenied
มีข้อดีคือให้คุณแสดงมุมมอง 403 ที่กำหนดเองของคุณ
หากคุณต้องการเพิ่มข้อยกเว้นคุณสามารถใช้:
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
แม่แบบหรือคุณสามารถใช้มิดเดิลแวร์เพื่อแสดงมุมมอง "ต้องห้าม" ที่กำหนดเอง
throw PermissionDenied
ไม่ได้เป็นสายฟังก์ชั่นโดยไม่ต้อง()
ในตอนท้าย
คุณสามารถเลือกที่จะจัดหาเทมเพลตแบบกำหนดเองที่ชื่อว่า"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)
ลองใช้วิธีนี้ส่งข้อความโดยมีข้อผิดพลาด
from django.core.exceptions import PermissionDenied
raise PermissionDenied("You do not have permission to Enter Clients in Other Company, Be Careful")
Http404
แต่ไม่Http403
? ทำไมความไม่ลงรอยกัน?