2010-10-26 13 views
12

मैं बोतल डॉक के माध्यम से पढ़ रहा था - और this भर में आया था:संदर्भ स्थानीय - वे स्थानीय संदर्भ चर वैश्विक कैसे बनाते हैं?

... वेब अनुप्रयोगों के लिए यह महत्वपूर्ण है डेटा के लिए एक ग्राहक सर्वर के लिए भेजा प्रतिक्रिया होती है। फ्लास्क में यह जानकारी वैश्विक अनुरोध ऑब्जेक्ट द्वारा प्रदत्त है। यदि आपके पास पायथन के साथ कुछ अनुभव है तो आप सोच सकते हैं कि ऑब्जेक्ट वैश्विक कैसे हो सकता है और कैसे फ्लास्क अभी भी थ्रेडसेफ होने का प्रबंधन करता है। जवाब संदर्भ स्थानीय लोगों रहे हैं ...

अब मैं संदर्भ में स्थानीय लोगों से समझ में आ with बयान की तरह सामान होने के लिए (निश्चित रूप से thats क्या python 2.6 doc सुझाव देने के लिए लगता है)। मैं यह देखने के लिए संघर्ष कर रहा हूं कि यह आपको स्थानीय नामस्थान में रहने वाले वैश्विक रूप से सुलभ युद्धों की अनुमति कैसे देगा? यह वैचारिक रूप से कैसे काम करता है?

इसके अलावा: ग्लोबल्स को आमतौर पर गंदी माना जाता है, मैं इसे लेता हूं, तो यह ठीक क्यों है?

+3

ठीक है कर सकता है, क्योंकि साफ़ वैश्विक नीचे बहुत अच्छी तरह से। – aaronasterling

उत्तर

4

वे वास्तविक वस्तुओं के लिए वास्तव में प्रॉक्सी ऑब्जेक्ट्स हैं ताकि जब आप किसी संदर्भ को संदर्भित करते हैं तो आपको अपने वर्तमान धागे के लिए ऑब्जेक्ट तक पहुंच प्राप्त होती है।

एक उदाहरण request ऑब्जेक्ट होगा। आप इसे globlals.py में सेट अप देख सकते हैं और फिर फ्लास्क के लिए __init__.py में आयात किया जा सकता है।

इस का लाभ यह है कि आप अनुरोध सिर्फ

from flask import request 

करके तरीकों

@app.route('/') 
def hello_world(): 
    return "Hello World!" 

की तरह एक पैरामीटर के रूप में चारों ओर अनुरोध पारित करने के लिए बिना पहुँच सकते हैं और लिख सकते हैं।

यह Werkzeug से कुछ पुन: प्रयोज्य कोड पुस्तकालयों का उपयोग कर रहा है।

अजगर में
+0

क्षमा करें अगर मैं घना हो रहा हूं: लेकिन अगर मुझे यह सही तरीके से मिलता है तो वे संदर्भ को 'स्टैकफ्रेम' पर दबाते हैं और फिर इस स्टैक के आधार पर सही लिंक ऑब्जेक्ट कॉल को उचित रूप से रूट करने में सक्षम होते हैं? – Malang

+1

यदि आप [Werkzeug के लिए स्रोत] की एक प्रतिलिपि लेते हैं (http://pypi.python.org/packages/source/W/Werkzeug/Werkzeug-0.6.2.tar.gz) और 'local.py' में देखें आप देखेंगे कि 'लोकल' क्लास मूल रूप से वर्तमान थ्रेड आईडी के साथ एक शब्दकोश का उपयोग करती है क्योंकि सही वस्तुओं को सुरक्षित रूप से स्टोर और पुनर्प्राप्त करने की कुंजी होती है। कोड क्या कर रहा है यह जानने के लिए कुछ परीक्षण स्थापित किए बिना मैं कटौती कर सकता हूं। – mikej

+0

मुझे नहीं लगता कि उपरोक्त के लिए एक स्टैक आवश्यक है। यह सिर्फ एक अनुमान है लेकिन स्टैक आपके द्वारा लिंक किए गए दस्तावेज़ में इस टिप्पणी से संबंधित एक अतिरिक्त परत जोड़ सकता है: * यह एक बुद्धिमान तरीके से करता है कि एक एप्लिकेशन तोड़ने के बिना किसी अन्य एप्लिकेशन को आमंत्रित कर सकता है। * – mikej

-2

नामस्थान मूल रूप से शब्दकोशों आप

globals()['foo']=bar
+0

+1 अच्छा बिंदु:) – Malang

+0

यह नीचे क्यों मतदान किया जाता है? मैं चाहता हूं कि एस/ओ ने स्पष्टीकरण छोड़ने के लिए नीचे मतदाताओं को लागू किया। यह एक अच्छी शिक्षा हो सकती है। मैंने कुछ याद किया होगा, लेकिन अगर मैं 'foo' के लिए थ्रेड आईडी का उपयोग करता हूं तो यह एक पूर्ण प्रति-थ्रेड ग्लोबल वैरिएबल जैसा दिखता है जो अनिवार्य रूप से स्वीकार किए गए उत्तर के समान विचार है।पाइथन निर्मित 'dict' में थ्रेड सुरक्षित है। –

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