थ्रेड सुरक्षा के बारे में this document पढ़ने के बाद, मुझे लगता है कि प्रलेखन में कुछ याद आ रही है, या इसके बारे में मेरी पढ़ाई, या मेरी तर्क है।टेम्पलेट टैग
के एक सरल उदाहरण देता हूँ:
class HelloWorldNode(template.Node):
def render(self, context):
return "O HAI LOL"
@register.tag(name="hello_world")
def hello_world(parser, tokens):
"""
Greets the world with wide-eyed awe.
"""
return HelloWorldNode()
मैं जब भी hello_world
टैग प्रयोग किया जाता है HelloWorldNode
वर्ग का एक नया उदाहरण के निर्माण के लिए इस कोड को समझा। अन्य उदाहरणों में निर्माता के लिए तर्क गुजर शामिल, इस तरह:
class HelloWorldNode(template.Node):
def __init__(self, message):
self.message = message
def render(self, context):
return "O HAI LOL " + message
@register.tag(name="hello_world")
def hello_world(parser, tokens):
"""
Greets the world with wide-eyed awe.
"""
message = tokens.split_contents()[1]
return HelloWorldNode(message)
इस प्रकार, जब hello_world
निष्पादित किया जाता है, HelloWorldNode का एक नया उदाहरण बन जाता है, और उदाहरण के शब्दकोश एक विशेषता message
है। यह उदाहरण निश्चित रूप से केवल टैग के दिए गए उदाहरण के प्रतिपादन के लिए उपयोग किया जाना चाहिए, क्योंकि इसे अन्य प्रस्तुतिकरणों के लिए उपयोग करने का अर्थ यह होगा कि इसके लिए बाध्य डेटा गलत होगा। यदि यह मामला नहीं था, तो तर्क टैग के विभिन्न उपयोगों के बीच मिश्रित हो जाएंगे।
डॉक्स से अन्य उदाहरण को देखते हुए, यहाँ here से एक सरल उदाहरण है:
def do_current_time(parser, token):
tag_name, format_string = token.split_contents()
return CurrentTimeNode(format_string[1:-1])
इस टोकन समारोह के लिए पारित से डेटा लेता है के रूप में, एक ही रास्ता है कि CurrentTimeNode काम कर सकते हैं यह है कि एक नया एक हर बार do_current_time
लागू किया जाता है।
प्रलेखन पृष्ठ पर वापस, जहां विसंगति सेट होती है। यह 'खराब' है।
class CycleNode(Node):
def __init__(self, cyclevars):
self.cycle_iter = itertools.cycle(cyclevars)
def render(self, context):
return self.cycle_iter.next()
दस्तावेज़ का कहना है कि एक ही टैग का उपयोग कर दो पृष्ठों तो दौड़ की स्थिति का अनुभव हो सकता है, तो वे दोनों एक ही नोड का उपयोग करें। मुझे समझ में नहीं आता कि कैसे दो टेम्पलेट्स प्रतिपादन एक ही उदाहरण साझा करना समाप्त कर सकता है यदि वे स्वतंत्र रूप से अपने आप को तुरंत चालू करते हैं।
इस हल करने के लिए जिस तरह से, कहते हैं डॉक्स इस तरह है:
class CycleNode(Node):
def __init__(self, cyclevars):
self.cyclevars = cyclevars
def render(self, context):
if self not in context.render_context:
context.render_context[self] = itertools.cycle(self.cyclevars)
cycle_iter = context.render_context[self]
return cycle_iter.next()
यह self
साथ सूचकांक context.render_context
प्रतीत होता है। कि के निहितार्थ होना चाहिए कि self
दो तरीकों में से एक में उदाहरण की पहचान के लिए प्रयोग किया जाता है:
self
संदर्भ एक पूरी प्रणाली में वर्ग के विशिष्ट उदाहरणself
संदर्भ वर्ग केवल, और क्रम में उदाहरण के संदर्भ में संदर्भ प्रस्तुत करने के लिए
यदि 1 सत्य है, तो क्यों न केवल self
के साथ डेटा संबद्ध करें?
यदि 2 सत्य है, और संदर्भ प्रस्तुत करना "वर्तमान में प्रस्तुत किए जा रहे टेम्पलेट के संदर्भ से जुड़ा हुआ है", तो उसी पृष्ठ पर टेम्पलेट टैग के दो उदाहरणों के बीच अंतर करना कैसे संभव है?
क्या प्रत्येक बार टैग का आह्वान किया जाने पर नोड तुरंत अलग हो जाता है? यदि हां, तो समवर्ती समस्या क्यों? यदि नहीं, तो क्यों नहीं?