Làm cách nào để trả lại mã trạng thái HTTP 204 từ chế độ xem Django?


81

Tôi muốn trả lại mã trạng thái 204 No Contenttừ chế độ xem Django. Nó phản hồi với một ĐĂNG tự động cập nhật cơ sở dữ liệu và tôi chỉ cần cho biết cập nhật đã thành công (mà không cần chuyển hướng máy khách).

Có các lớp con của HttpResponseđể xử lý hầu hết các mã khác nhưng không phải là 204.

Cách đơn giản nhất để làm điều này là gì?


Tôi chưa làm điều này trước đây, nhưng bạn đã thử đặt thuộc tính trạng thái của đối tượng phản hồi trước khi trả lại phản hồi từ chế độ xem của mình chưa? Ngoài ra, đây là một câu hỏi SO khác về điều này: stackoverflow.com/questions/408541/…
alan

Câu trả lời:


172
return HttpResponse(status=204)

4
Cảm ơn. W3C tuyên bố "Phản hồi 204 KHÔNG PHẢI bao gồm nội dung thư" vì vậy (giả sử tham số nội dung ánh xạ đến nội dung thư) mặc dù vậy, nó phải để trống, phải không?
Flash

1
Đối với bất kỳ ai đọc không chỉ quan tâm đến mã 204, bạn có thể sử dụng nội dung thư với các phương thức HTTPResponse của Django.
Braden Holt


20

Hoặc những gì Steve Mayne đã trả lời hoặc xây dựng của riêng bạn bằng cách phân lớp HttpResponse:

from django.http import HttpResponse

class HttpResponseNoContent(HttpResponse):
    status_code = 204

def my_view(request):
    return HttpResponseNoContent()

18

Khi sử dụng kết xuất , có một statusđối số từ khóa.

return render(request, 'template.html', status=204)

(Lưu ý rằng trong trường hợp trạng thái 204 không nên có phần nội dung phản hồi, nhưng phương pháp này hữu ích cho các mã trạng thái khác.)


Điều này sẽ không gây ra chuyển hướng?
GobSmack,

Không cần chuyển hướng, nó phải làm giống như câu trả lời trên cùng, chỉ cần cú pháp ngắn hơn. (Sử dụng mã trạng thái 204 cho chuyển hướng sẽ rất kỳ lạ, nếu nó hoạt động hoàn toàn).
Đánh dấu

Ồ .. Có cách nào tôi có thể vượt qua trạng thái lỗi mà không thực sự tải lại trang hoặc chuyển hướng sang trang mới không? Tôi muốn sử dụng nó khi tệp mà người dùng đang cố gắng lưu đã tồn tại. Tôi đã thử 409 & 422. Nhưng, họ chuyển hướng nó sang trang mới. Tôi biết AJAX là giải pháp khác. Nhưng đang tự hỏi nếu Django có bất kỳ thủ thuật.
GobSmack,

1
Mã trạng thái được sử dụng khi khách truy cập đang tải một trang. Vì vậy, họ phải đang tải một trang; thay đổi mã không gây ra chuyển hướng bổ sung nhưng bạn vẫn đang tải một trang mới. Nếu họ đang ở trên một trang và bạn muốn thông báo cho họ mà không cần tải lại, thì tôi không nghĩ có cách nào để cập nhật mã của trang hiện tại (dù sao thì tôi cũng không nghĩ nó sẽ hữu ích lắm). Vì vậy: nếu họ lưu một biểu mẫu đưa họ đến một trang mới, thì bạn có thể chọn bất kỳ mã trạng thái nào cho trang kết quả. Nếu nó không tải một trang mới, chỉ cần hiển thị thông báo và quên mã trạng thái.
Đánh dấu

Tôi hiểu những gì bạn đang nói. Nhưng, tôi thực sự chỉ cần cập nhật trang. Vì vậy, tôi đoán, tôi sẽ phải sử dụng AJAX + Django :( Cảm ơn rất nhiều mặc dù!
GobSmack

0

Các câu trả lời khác hầu hết đều hoạt động, nhưng chúng không tạo ra phản hồi HTTP 204 tuân thủ hoàn toàn, vì chúng vẫn chứa tiêu đề nội dung. Điều này có thể dẫn đến cảnh báo WSGI và được chọn bởi các công cụ kiểm tra như Kiểm tra web Django.

Đây là một lớp cải tiến cho phản hồi HTTP 204 tuân thủ. (dựa trên vé Django này ):

from django.http import HttpResponse

class HttpResponseNoContent(HttpResponse):
    """Special HTTP response with no content, just headers.

    The content operations are ignored.
    """

    def __init__(self, content="", mimetype=None, status=None, content_type=None):
        super().__init__(status=204)

        if "content-type" in self._headers:
            del self._headers["content-type"]

    def _set_content(self, value):
        pass

    def _get_content(self, value):
        pass

def my_view(request):
    return HttpResponseNoContent()
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.