Làm cách nào để tăng Phản hồi Cấm trong django


168

Tôi muốn làm như sau:

raise HttpResponseForbidden()

Nhưng tôi nhận được lỗi:

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

Làm thế nào tôi nên làm điều này?

Câu trả lời:


183

Trả lại từ chế độ xem như bất kỳ phản ứng nào khác.

from django.http import HttpResponseForbidden

return HttpResponseForbidden()

30
Tại sao có tồn tại một lớp ngoại lệ Http404nhưng không Http403? Tại sao không thống nhất?
Flimm

@Flimm stackoverflow.com/questions/3297048/ Từ Tôi không chắc chắn về Django, nhưng Django REST Framework có: từ trạng thái nhập trạng thái rest_framework.HTTP_403_FORBIDDEN 403
David Watson

15
Trên thực tế, việc sử dụng raise PermissionDeniedcó lợi thế là cho phép bạn hiển thị chế độ xem 403 tùy chỉnh của mình
guival

376

nếu bạn muốn đưa ra một ngoại lệ, bạn có thể sử dụng:

from django.core.exceptions import PermissionDenied

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

Nó được ghi lại ở đây:

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

Trái với việc giữ lại HttpResponseForbidden, nâng cao PermissionDeniedgây ra lỗi được hiển thị bằng cách sử dụng 403.htmlmẫu hoặc bạn có thể sử dụng phần mềm trung gian để hiển thị chế độ xem "Cấm" tùy chỉnh.


2
Chúng tôi có thể thêm một tin nhắn tùy chỉnh trong PermissionDenied không?
AJ

2
Jack, vâng, bạn có thể - làm một cái gì đó như: tăng PermissionDenied ("Không đăng nhập người dùng")
Mark Chackerian

1
Không chắc chắn nếu nó quan trọng, nhưng các tài liệu nói throw PermissionDeniedkhông phải là một cuộc gọi chức năng, mà không có ()kết thúc.
Fydo

2
Lợi thế của việc sử dụng này so với HttpResponseForbidden là gì?
Flimm

3
@Flimm: Điều này tự động kích hoạt 403 ở cấp độ phần mềm trung gian, cho phép bạn hiển thị chế độ xem "Cấm" tùy chỉnh của mình.
Hư hỏng hữu cơ

11

Bạn có thể tùy ý cung cấp một mẫu tùy chỉnh có tên "403.html" để kiểm soát kết xuất 403 lỗi HTTP.

Như được chỉ ra chính xác bởi @ dave-halter, mẫu 403 chỉ có thể được sử dụng nếu bạn tăng PermissionDenied

Dưới đây là chế độ xem mẫu được sử dụng để kiểm tra các mẫu tùy chỉnh "403.html", "404.html" và "500.html"; vui lòng đảm bảo đặt DEBUG = Sai trong cài đặt của dự án hoặc khung sẽ hiển thị theo dõi thay vì 404 và 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
Điều này không hoạt động. Mẫu 403 chỉ có thể được sử dụng nếu bạn tăng PermissionDenied.
Dave Halter

Cảm ơn bạn @ dave-halter, bạn đúng. Tôi đã cập nhật nhận xét của mình để sửa nó.
Mario Desserti

2

Hãy thử cách này, gửi tin nhắn có lỗi

from django.core.exceptions import PermissionDenied
raise PermissionDenied("You do not have permission to Enter Clients in Other Company, Be Careful")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.