मैं एक Django दृश्य से HTTP स्थिति कोड 204 कैसे वापस कर सकता हूं?


82

मैं 204 No Contentएक Django दृश्य से स्थिति कोड वापस करना चाहता हूं । यह एक स्वचालित POST के जवाब में है जो एक डेटाबेस को अपडेट करता है और मुझे केवल यह इंगित करने की आवश्यकता है कि अपडेट सफल था (क्लाइंट को पुनर्निर्देशित किए बिना)।

HttpResponseअधिकांश अन्य कोड को संभालने के लिए उपवर्ग हैं लेकिन 204 नहीं।

ऐसा करने का सबसे सरल तरीका क्या है?


मैंने पहले ऐसा नहीं किया है, लेकिन क्या आपने अपने दृष्टिकोण से प्रतिक्रिया वापस करने से पहले प्रतिक्रिया वस्तु की स्थिति विशेषता सेट करने की कोशिश की है? इसके अलावा, यहाँ इस बारे में एक और SO प्रश्न है: stackoverflow.com/questions/408541/…
alan

जवाबों:


173
return HttpResponse(status=204)

4
धन्यवाद। W3C में कहा गया है, "204 की प्रतिक्रिया में एक संदेश-निकाय शामिल नहीं होना चाहिए" इसलिए (संदेश निकाय के लिए सामग्री पैरामीटर मानचित्रों को मानते हुए) यह रिक्त होना चाहिए, हालांकि, है ना?
फ्लैश

1
ऐसे किसी भी व्यक्ति के लिए जो केवल 204 कोड से संबंधित नहीं है, आप Django के HTTPResponse विधियों के साथ एक संदेश निकाय का उपयोग कर सकते हैं।
ब्रैडन होल्ट


20

या तो स्टीव मेने ने जो जवाब दिया, या HttpResponse को उपखंड करके अपना निर्माण करें:

from django.http import HttpResponse

class HttpResponseNoContent(HttpResponse):
    status_code = 204

def my_view(request):
    return HttpResponseNoContent()

19

रेंडर का उपयोग करते समय , एक statusकीवर्ड तर्क है।

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

(ध्यान दें कि स्थिति 204 के मामले में एक प्रतिक्रिया निकाय नहीं होना चाहिए, लेकिन यह विधि अन्य स्थिति कोड के लिए उपयोगी है।)


हालांकि यह एक पुनर्निर्देशन का कारण नहीं होगा?
गोबस्मैक

कोई पुनर्निर्देशित की जरूरत नहीं है, यह शीर्ष उत्तर के रूप में ही करना चाहिए, बस छोटे वाक्यविन्यास। (रीडायरेक्ट के लिए स्थिति कोड 204 का उपयोग करना बहुत ही अजीब होगा, अगर यह बिल्कुल भी काम करता है)।
मार्क

ओह .. क्या कोई ऐसा तरीका है जिससे मैं वास्तव में पृष्ठ को पुनः लोड करने या नए पृष्ठ पर पुनर्निर्देशित किए बिना त्रुटि स्थिति पारित कर सकता हूं? मैं इसका उपयोग तब करना चाहता हूं जब कोई फ़ाइल जो उपयोगकर्ता पहले से मौजूद सहेजने की कोशिश कर रहा है। मैंने 409 और 422 की कोशिश की। लेकिन, उन्होंने इसे नए पेज पर भेज दिया। मुझे पता है कि AJAX दूसरा समाधान है। लेकिन सोच रहा था कि क्या Django की कोई चाल थी।
गोबस्मैक

1
स्थिति कोड तब उपयोग किए जाते हैं जब आगंतुक पृष्ठ लोड कर रहे होते हैं। इसलिए उन्हें पहले से ही एक पृष्ठ लोड करना होगा; कोड बदलने से अतिरिक्त रीडायरेक्ट नहीं होता है लेकिन आप अभी भी एक नया पृष्ठ लोड कर रहे हैं। यदि वे किसी पृष्ठ पर हैं और आप उन्हें पुनः लोड किए बिना सूचित करना चाहते हैं, तो मुझे नहीं लगता कि वर्तमान पृष्ठ के कोड को अपडेट करने का कोई तरीका है (मुझे नहीं लगता कि यह वैसे भी बहुत उपयोगी होगा)। इसलिए: यदि वे एक फॉर्म सेव करते हैं जो उन्हें एक नए पेज पर भेजता है, तो आप परिणाम पेज के लिए कोई भी स्टेटस कोड चुन सकते हैं। यदि यह नया पेज लोड नहीं करता है, तो केवल संदेश दिखाएं और स्थिति कोड भूल जाएं।
मार्क

मुझे वही मिल रहा है जो तुम कह रहे हो। लेकिन, मुझे वास्तव में सिर्फ पेज अपडेट करने की जरूरत है। तो, मुझे लगता है, मुझे AJAX + Django का उपयोग करना होगा :( बहुत बहुत धन्यवाद!
GobSmack

0

अन्य उत्तर ज्यादातर काम करते हैं, लेकिन वे पूरी तरह से अनुपालन HTTP 204 प्रतिक्रियाओं का उत्पादन नहीं करते हैं, क्योंकि वे अभी भी एक सामग्री हेडर रखते हैं। इसका परिणाम WSGI चेतावनियों में हो सकता है और इसे Django वेब टेस्ट जैसे टेस्ट टूल द्वारा उठाया जाता है।

यहाँ HTTP 204 प्रतिक्रिया के लिए एक बेहतर वर्ग है जो आज्ञाकारी है। (इस Django टिकट पर आधारित ):

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()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.