2011-09-20 17 views
8

थ्रेड सुरक्षा के बारे में 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 दो तरीकों में से एक में उदाहरण की पहचान के लिए प्रयोग किया जाता है:

  1. self संदर्भ एक पूरी प्रणाली में वर्ग के विशिष्ट उदाहरण
  2. self संदर्भ वर्ग केवल, और क्रम में उदाहरण के संदर्भ में संदर्भ प्रस्तुत करने के लिए

यदि 1 सत्य है, तो क्यों न केवल self के साथ डेटा संबद्ध करें?

यदि 2 सत्य है, और संदर्भ प्रस्तुत करना "वर्तमान में प्रस्तुत किए जा रहे टेम्पलेट के संदर्भ से जुड़ा हुआ है", तो उसी पृष्ठ पर टेम्पलेट टैग के दो उदाहरणों के बीच अंतर करना कैसे संभव है?

क्या प्रत्येक बार टैग का आह्वान किया जाने पर नोड तुरंत अलग हो जाता है? यदि हां, तो समवर्ती समस्या क्यों? यदि नहीं, तो क्यों नहीं?

उत्तर

0

इसे this के करीब पढ़ने के साथ मिला।

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

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

इस प्रकार self मेरे प्रश्न में टेम्पलेट के भीतर विशिष्ट नोड की पहचान है। रेंडर संदर्भ के साथ संयुक्त, यह एक अनूठी पहचान देता है जिस पर आवृत्ति चर लटका है।

संबंधित मुद्दे