2011-09-01 8 views
7

मैंने एक प्लगइन लिखा है जो मेरे कोड को सक्रिय करने के लिए एक सिग्नल भेजता है। हालांकि, यह मेरे कोड पर उपयोगकर्ता-अनुरोध ऑब्जेक्ट नहीं भेजता है। मैं मुख्य आवेदन को संशोधित किए बिना वर्तमान अनुरोध को पुनर्प्राप्त करने का एक तरीका ढूंढ रहा हूं। मुझे वैश्विक अनुरोध से संबंधित कोई दस्तावेज नहीं मिल रहा है (जैसे PHP में $_SERVER['REMOTE_ADDR'])।पाइथन/Django में वैश्विक अनुरोध चर उपलब्ध है?

मैं जानना चाहता हूं कि पाइथन/Django में ऐसा करने के लिए कोई वैरिएबल है या नहीं।

def detail(request, some_param): 
    # [...] 

पैरामीटर request HTTP अनुरोध के बारे में जानकारी होती है:

उत्तर

0

मैं इसे जानते हैं, आप की तरह की अनेक विधियों का उपयोग कर अपने Django दृश्य निर्धारित करते। उदाहरण के लिए request.META['HTTP_X_FORWARDED_FOR'], ग्राहक का आईपी पता देता है।

यदि आपकी प्लगइन के अनुरोधों के साथ कुछ करने के लिए कुछ है, तो इसकी कक्षाएं और फ़ंक्शन शायद आपके दृश्य से तत्काल/कॉल किए जाएंगे। इसका मतलब है कि आपको इसे वर्तमान request ऑब्जेक्ट पास करने की आवश्यकता है, क्योंकि वैश्विक अनुरोध ऑब्जेक्ट के आसपास कोई समझ नहीं आता है। PHP में, यह संभव है, क्योंकि प्रत्येक अनुरोध पूरे कोड को स्क्रैच से निष्पादित करने का कारण बनता है, लेकिन Django अनुरोधों में सर्वर द्वारा प्रेषित किया जाता है और HttpRequest ऑब्जेक्ट्स का उपयोग करके ढांचे में चारों ओर पारित किया जाता है। अधिक जानकारी के लिए Django दस्तावेज़ के this भाग का भी संदर्भ लें।

+0

वहां पहले से ही मौजूद है कर रहे हैं विचारों सकते हैं, और मुझे क्या करना है प्लग-इन जो कि देखा गया सक्रिय करते हैं, लेकिन यह है कि विचारों स्वर्ग है मेरे कार्य को अनुरोध ऑब्जेक्ट नहीं भेजता है। मैं मुख्य आवेदन के कोड (विचार) के व्यवहार को भी बदल नहीं सकता हूं। तो, मुझे एक और समाधान की तलाश है। – scalopus

+0

यह शायद ही संभव है, मेरी अद्यतन पोस्ट देखें। Django एक साथ कई अनुरोधों को संभाल सकता है, इसलिए कुछ वैश्विक लेकिन अनुरोध-विशिष्ट स्थिति मौजूद नहीं हो सकती है। हो सकता है कि अगर आप अपनी प्लगइन क्या करते हैं, यह कैसे संरचित है, या यहां तक ​​कि कुछ कोड पोस्ट करने के बारे में अधिक जानकारी प्रदान करते हैं तो हम समाधान ढूंढ सकते हैं। –

13

Django वैश्विक अनुरोध वस्तु प्रदान नहीं करता है (यह वास्तव में एक धागा स्थानीय होगा, न कि वैश्विक)। लेकिन ऐसी कुछ तकनीकें हैं जिनका उपयोग आप स्वयं को एक ही प्रभाव प्राप्त करने के लिए कर सकते हैं: http://nedbatchelder.com/blog/201008/global_django_requests.html

+0

यह वास्तव में सबसे सटीक उत्तर है। एक दृश्य के बाहर अनुरोध कैसे प्राप्त करें। समाधान थोड़ा हैकिश (एक शब्दकोश में प्रत्येक थ्रेड के लिए अनुरोध ऑब्जेक्ट को पकड़ने वाले मिडलवेयर स्थापित करना), और यह सभी वैश्विक स्तर पर इसे पुनर्प्राप्त करने के बजाय अनुरोध को पास करने के लिए प्रोत्साहित करते हैं। ऐसा लगता है कि बहुत सारे 'ModelAdmin.save_model (...)' आगे बढ़ते हैं (और फिर भी खराब 'ModelAdmin.save_related (...) '। –

0

AFAIK यह उपलब्ध नहीं है, सिवाय इसके कि आप इसे उपलब्ध कराएं।

आप कॉपी कर सकते हैं + अन्य उत्तर में प्रदान की जाती स्निपेट पेस्ट कर, या आप इस लाइब्रेरी का उपयोग कर सकते हैं: वर्तमान अनुरोध हमेशा उपलब्ध बनाने के लिए https://pypi.python.org/pypi/django-crequest

Middleware।

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