Django 2.1 - TemplateResponse and SimpleTemplateResponse

TemplateResponse और SimpleTemplateResponse




django

TemplateResponse और SimpleTemplateResponse

मानक HttpResponse ऑब्जेक्ट स्थिर संरचनाएँ हैं। उन्हें निर्माण के समय पूर्व-प्रदान की गई सामग्री के एक ब्लॉक के साथ प्रदान किया जाता है, और जबकि उस सामग्री को संशोधित किया जा सकता है, यह ऐसे रूप में नहीं है जिससे संशोधनों को करना आसान हो।

हालाँकि, यह कभी-कभी सज्जाकार या मिडलवेयर को दृश्य द्वारा निर्मित होने के बाद प्रतिक्रिया को संशोधित करने की अनुमति देने के लिए फायदेमंद हो सकता है। उदाहरण के लिए, आप उपयोग किए जाने वाले टेम्पलेट को बदल सकते हैं, या संदर्भ में अतिरिक्त डेटा डाल सकते हैं।

TemplateResponse ऐसा करने का एक तरीका प्रदान करता है। मूल HttpResponse ऑब्जेक्ट्स के विपरीत, TemplateResponse ऑब्जेक्ट्स उस टेम्पलेट और संदर्भ के विवरण को बनाए रखते हैं जो प्रतिक्रिया की गणना करने के लिए दृश्य द्वारा प्रदान किया गया था। प्रतिक्रिया की अंतिम आउटपुट की गणना तब तक नहीं की जाती है जब तक कि जरूरत न हो, बाद में प्रतिक्रिया प्रक्रिया में।

SimpleTemplateResponse ऑब्जेक्ट्स

class SimpleTemplateResponse [source]

गुण

SimpleTemplateResponse.template_name

प्रदान किए जाने वाले टेम्पलेट का नाम। एक बैकएंड-निर्भर टेम्पलेट ऑब्जेक्ट (जैसे get_template() ), टेम्पलेट का नाम, या टेम्पलेट नामों की सूची को स्वीकार करता है।

उदाहरण: ['foo.html', 'path/to/bar.html']

SimpleTemplateResponse.context_data

टेम्प्लेट रेंडर करते समय संदर्भ डेटा का उपयोग किया जाना है। यह एक dict होनी चाहिए।

उदाहरण: {'foo': 123}

SimpleTemplateResponse.rendered_content

वर्तमान टेम्पलेट और संदर्भ डेटा का उपयोग करते हुए, प्रतिक्रिया सामग्री का वर्तमान प्रदान किया गया मूल्य।

SimpleTemplateResponse.is_rendered

एक बूलियन यह दर्शाता है कि क्या प्रतिक्रिया सामग्री प्रदान की गई है।

तरीके

SimpleTemplateResponse.__init__(template, context=None, content_type=None, status=None, charset=None, using=None) [source]

दिए गए टेम्पलेट, संदर्भ, सामग्री प्रकार, HTTP स्थिति, और चारसेट के साथ एक SimpleTemplateResponse ऑब्जेक्ट को इंस्टेंट करता है।

template
बैकएंड-निर्भर टेम्पलेट ऑब्जेक्ट (जैसे कि get_template() ) द्वारा लौटाया गया, टेम्पलेट का नाम या टेम्पलेट नामों की सूची।
context
टेम्प्लेट के संदर्भ में जोड़ने के लिए मूल्यों का एक बड़ा हिस्सा। डिफ़ॉल्ट रूप से, यह एक खाली शब्दकोश है।
content_type
HTTP Content-Type हेडर में शामिल मूल्य, MIME प्रकार विनिर्देश और वर्ण सेट एन्कोडिंग सहित। यदि content_type निर्दिष्ट है, तो इसका मान उपयोग किया जाता है। अन्यथा, DEFAULT_CONTENT_TYPE का उपयोग किया जाता है।
status
प्रतिक्रिया के लिए HTTP स्थिति कोड।
charset
वह चारसेट जिसमें प्रतिक्रिया को एनकोड किया जाएगा। यदि नहीं दिया गया है तो उसे content_type से निकाला जाएगा, और यदि वह असफल है, तो DEFAULT_CHARSET सेटिंग का उपयोग किया जाएगा।
using
टेम्पलेट लोड करने के लिए उपयोग करने के लिए एक टेम्पलेट इंजन का NAME
SimpleTemplateResponse.resolve_context(context) [source]

एक टेम्पलेट रेंडर करने के लिए उपयोग किया जाएगा संदर्भ डेटा प्रीप्रोसेस। संदर्भ डेटा की एक बड़ी संख्या को स्वीकार करता है। डिफ़ॉल्ट रूप से, वही dict

संदर्भ को अनुकूलित करने के लिए इस विधि को ओवरराइड करें।

SimpleTemplateResponse.resolve_template(template) [source]

प्रतिपादन के लिए उपयोग करने के लिए टेम्पलेट उदाहरण को हल करता है। एक बैकएंड-निर्भर टेम्पलेट ऑब्जेक्ट (जैसे get_template() ), टेम्पलेट का नाम, या टेम्पलेट नामों की सूची को स्वीकार करता है।

बैकेंड-आश्रित टेम्पलेट ऑब्जेक्ट उदाहरण प्रदान करने के लिए लौटाता है।

टेम्पलेट लोडिंग को कस्टमाइज़ करने के लिए इस विधि को ओवरराइड करें।

SimpleTemplateResponse.add_post_render_callback() [source]

एक कॉलबैक जोड़ें जो रेंडर होने के बाद लागू किया जाएगा। इस हुक का उपयोग कुछ प्रसंस्करण कार्यों (जैसे कैशिंग) को स्थगित करने के लिए किया जा सकता है जब तक कि रेंडरिंग नहीं हुआ है।

यदि SimpleTemplateResponse पहले से ही प्रदान किया गया है, तो कॉलबैक तुरंत लागू किया जाएगा।

जब कॉल किया जाता है, तो कॉलबैक को एक एकल तर्क दिया जाएगा - प्रस्तुत किया गया SimpleTemplateResponse उदाहरण।

यदि कॉलबैक एक मान देता है जो कोई None , तो इसका उपयोग मूल प्रतिक्रिया ऑब्जेक्ट के बजाय प्रतिक्रिया के रूप में किया जाएगा (और अगले पोस्ट रेंडरिंग कॉलबैक आदि के लिए पारित किया जाएगा)

SimpleTemplateResponse.render() [source]

SimpleTemplateResponse.rendered_content द्वारा प्राप्त परिणाम के लिए response.content सेट करता है, सभी पोस्ट-रेंडरिंग कॉलबैक चलाता है, और परिणामी प्रतिक्रिया ऑब्जेक्ट देता है।

render() में केवल पहली बार कॉल करने का प्रभाव होगा। बाद की कॉल पर, यह पहली कॉल से प्राप्त परिणाम लौटाएगा।

TemplateResponse ऑब्जेक्ट्स

class TemplateResponse [source]

TemplateResponse SimpleTemplateResponse का एक उपवर्ग है जो वर्तमान HttpRequest बारे में जानता है।

तरीके

TemplateResponse.__init__(request, template, context=None, content_type=None, status=None, charset=None, using=None) [source]

दिए गए अनुरोध, टेम्पलेट, संदर्भ, सामग्री प्रकार, HTTP स्थिति, और चारसेट के साथ एक TemplateResponse वस्तु को इंस्टेंट करता है।

request
एक HttpRequest उदाहरण।
template
बैकएंड-निर्भर टेम्पलेट ऑब्जेक्ट (जैसे कि get_template() ) द्वारा लौटाया गया, टेम्पलेट का नाम या टेम्पलेट नामों की सूची।
context
टेम्प्लेट के संदर्भ में जोड़ने के लिए मूल्यों का एक बड़ा हिस्सा। डिफ़ॉल्ट रूप से, यह एक खाली शब्दकोश है।
content_type
HTTP Content-Type हेडर में शामिल मूल्य, MIME प्रकार विनिर्देश और वर्ण सेट एन्कोडिंग सहित। यदि content_type निर्दिष्ट है, तो इसका मान उपयोग किया जाता है। अन्यथा, DEFAULT_CONTENT_TYPE का उपयोग किया जाता है।
status
प्रतिक्रिया के लिए HTTP स्थिति कोड।
charset
वह चारसेट जिसमें प्रतिक्रिया को एनकोड किया जाएगा। यदि नहीं दिया गया है तो उसे content_type से निकाला जाएगा, और यदि वह असफल है, तो DEFAULT_CHARSET सेटिंग का उपयोग किया जाएगा।
using
टेम्पलेट लोड करने के लिए उपयोग करने के लिए एक टेम्पलेट इंजन का NAME

प्रतिपादन की प्रक्रिया

इससे पहले कि कोई TemplateResponse उदाहरण क्लाइंट को वापस किया जा सके, उसे प्रस्तुत किया जाना चाहिए। रेंडरिंग प्रक्रिया टेम्पलेट और संदर्भ के मध्यवर्ती प्रतिनिधित्व को लेती है, और इसे अंतिम बाइट स्ट्रीम में बदल देती है जिसे क्लाइंट को परोसा जा सकता है।

ऐसी तीन परिस्थितियाँ हैं, जिनके तहत TemplateResponse जाएगा:

  • जब SimpleTemplateResponse.render() विधि का उपयोग करके स्पष्ट रूप से TemplateResponse उदाहरण प्रस्तुत किया गया है।
  • जब प्रतिक्रिया की सामग्री स्पष्ट रूप से response.content असाइन करके निर्धारित की जाती है।
  • टेम्पलेट प्रतिक्रिया मिडलवेयर से गुजरने के बाद, लेकिन प्रतिक्रिया मिडलवेयर से गुजरने से पहले।

एक TemplateResponse केवल एक बार प्रदान किया जा सकता है। SimpleTemplateResponse.render() लिए पहला कॉल प्रतिक्रिया की सामग्री सेट करता है; बाद के रेंडरिंग कॉल प्रतिक्रिया सामग्री को नहीं बदलते हैं।

हालाँकि, जब response.content स्पष्ट रूप से असाइन किया जाता है, तो परिवर्तन हमेशा लागू होता है। यदि आप सामग्री को फिर से प्रस्तुत करने के लिए मजबूर करना चाहते हैं, तो आप प्रदान की गई सामग्री का पुनर्मूल्यांकन कर सकते हैं, और प्रतिक्रिया की सामग्री को मैन्युअल रूप से असाइन कर सकते हैं:

# Set up a rendered TemplateResponse
>>> from django.template.response import TemplateResponse
>>> t = TemplateResponse(request, 'original.html', {})
>>> t.render()
>>> print(t.content)
Original content

# Re-rendering doesn't change content
>>> t.template_name = 'new.html'
>>> t.render()
>>> print(t.content)
Original content

# Assigning content does change, no render() call required
>>> t.content = t.rendered_content
>>> print(t.content)
New content

कॉलबैक के बाद रेंडर करें

कुछ ऑपरेशन - जैसे कि कैशिंग - एक अनियंत्रित टेम्पलेट पर प्रदर्शन नहीं किया जा सकता है। उन्हें पूरी तरह से पूर्ण और प्रदान की गई प्रतिक्रिया पर किया जाना चाहिए।

यदि आप मिडलवेयर का उपयोग कर रहे हैं, तो समाधान आसान है। मिडलवेयर एक दृश्य से बाहर निकलने पर प्रतिक्रिया की प्रक्रिया के लिए कई अवसर प्रदान करता है। यदि आप प्रतिक्रिया मिडलवेयर में व्यवहार करते हैं, तो टेम्पलेट रेंडरिंग होने के बाद इसे निष्पादित करने की गारंटी है।

हालाँकि, यदि आप डेकोरेटर का उपयोग कर रहे हैं, तो समान अवसर मौजूद नहीं हैं। डेकोरेटर में परिभाषित किसी भी व्यवहार को तुरंत नियंत्रित किया जाता है।

इसकी भरपाई करने के लिए (और किसी अन्य अनुरूप उपयोग के मामले), TemplateResponse रिप्रेसेंट आपको कॉलबैक को पंजीकृत करने की अनुमति देता है जो रेंडरिंग पूरी होने पर आह्वान किया जाएगा। इस कॉलबैक का उपयोग करके, आप महत्वपूर्ण प्रसंस्करण को एक बिंदु तक स्थगित कर सकते हैं, जहां आप गारंटी दे सकते हैं कि प्रदान की गई सामग्री उपलब्ध होगी।

पोस्ट-रेंडर कॉलबैक को परिभाषित करने के लिए, केवल एक फ़ंक्शन को परिभाषित करें जो एकल तर्क लेता है - प्रतिक्रिया - और टेम्पलेट प्रतिक्रिया के साथ उस फ़ंक्शन को पंजीकृत करें:

from django.template.response import TemplateResponse

def my_render_callback(response):
    # Do content-sensitive processing
    do_post_processing()

def my_view(request):
    # Create a response
    response = TemplateResponse(request, 'mytemplate.html', {})
    # Register the callback
    response.add_post_render_callback(my_render_callback)
    # Return the response
    return response

my_render_callback() mytemplate.html रेंडर होने के बाद mytemplate.html किया जाएगा, और तर्क के रूप में पूरी तरह से प्रदान की गई TemplateResponse उदाहरण प्रदान किया जाएगा।

यदि टेम्प्लेट पहले से ही प्रदान किया गया है, तो कॉलबैक तुरंत लागू किया जाएगा।

TemplateResponse और SimpleTemplateResponse का उपयोग करना

TemplateResponse ऑब्जेक्ट का उपयोग कहीं भी किया जा सकता है जो कि एक सामान्य HttpResponse का उपयोग किया जा सकता है। इसे कॉलिंग render() विकल्प के रूप में भी इस्तेमाल किया जा सकता है।

उदाहरण के लिए, निम्नलिखित सरल दृश्य एक TemplateResponse साथ एक साधारण टेम्पलेट और एक क्वेरीसेट वाला संदर्भ देता है:

from django.template.response import TemplateResponse

def blog_index(request):
    return TemplateResponse(request, 'entry_list.html', {'entries': Entry.objects.all()})