2012-02-29 7 views
6

मैं एक django वेबसर्वर विकसित कर रहा हूं जिस पर एक और मशीन (ज्ञात आईपी के साथ) मेरे वेबसर्वर पर एक स्प्रेडशीट अपलोड कर सकती है। के बाद स्प्रेडशीट अपडेट कर दी गई है, मैं स्प्रेडशीट पर कुछ प्रसंस्करण/सत्यापन/विश्लेषण ट्रिगर करना चाहता हूं (जो 5 मिनट ले सकता है --- दूसरे सर्वर के लिए प्रतिक्रिया के लिए उचित रूप से प्रतीक्षा करने के लिए बहुत लंबा है) और फिर दूसरा भेजें मशीन (एक ज्ञात आईपी के साथ) एक HttpResponse इंगित करता है कि डेटा प्रोसेसिंग समाप्त हो गया है।django व्यू से HttpResponse लौटने के बाद ट्रिगर फ़ंक्शन

मुझे लगता है कि आप एक HttpResponse लौटने के बाद processing.data() ऐसा नहीं कर सकते, लेकिन कार्यात्मक मैं कोड है कि कुछ इस तरह दिखता हैं:

# processing.py 
def spreadsheet(*args, **kwargs): 
    print "[robot voice] processing spreadsheet........." 
    views.finished_processing_spreadsheet() 

# views.py 
def upload_spreadsheet(request): 
    print "save the spreadsheet somewhere" 
    return HttpResponse("started processing spreadsheet") 
    processing.data() 

def finished_processing_spreadsheet(): 
    print "send good news to other server (with known IP)" 

मुझे पता है कि व्यक्तिगत रूप से प्रत्येक कार्य में लिखने के लिए है, लेकिन मैं प्रभावी ढंग से कैसे कर सकते processing.data()views.upload_spreadsheet पर एक प्रतिक्रिया वापस कर दी है?

मैंने django's request_finished signaling framework का उपयोग करने का प्रयास किया लेकिन यह HttpResponse लौटने के बाद processing.spreadsheet() विधि को ट्रिगर नहीं करता है। मैंने एक ही समस्या के साथ views.upload_spreadsheet पर सजावट का उपयोग करने की कोशिश की।

मेरे पास एक स्याही है कि middleware या संभवतः custom class-based view लिखने के साथ ऐसा कुछ हो सकता है, जिसमें से मुझे कोई अनुभव नहीं है, इसलिए मैंने सोचा कि मैं कुछ मदद की तलाश में ब्रह्मांड को प्रश्न पूछूंगा।

आपकी मदद के लिए धन्यवाद!

उत्तर

4

वास्तव में Django एक सिंक्रोनस मॉडल है। यदि आप असली एसिंक प्रोसेसिंग करना चाहते हैं, तो आपको एक संदेश कतार की आवश्यकता है। डीजेंगो के साथ सबसे ज्यादा इस्तेमाल अजवाइन है, यह थोड़ा "ओवरकिल" देख सकता है लेकिन यह एक अच्छा जवाब है।

हमें इसकी आवश्यकता क्यों है? क्योंकि एक wsgi ऐप में, apache निष्पादन योग्य को अनुरोध देता है, और निष्पादन योग्य पाठ देता है। यह केवल एक बार होता है जब निष्पादन योग्य अपना निष्पादन समाप्त करता है जो अपाचे ज्ञान अनुरोध के अंत में होता है।

+0

यह समझाने के लिए धन्यवाद कि यह आवश्यक क्यों है, क्रिस्टोफ़। आपके और जेपीआईसी के स्पष्टीकरण के आधार पर, मुझे लगता है कि मुझे थोड़ा और नींद आने के बाद सेलेरी की जांच होगी। – dino

3

आपके कार्यान्वयन के साथ समस्या यह है कि यदि प्रक्रिया में स्प्रेडशीट की संख्या श्रमिकों की संख्या के बराबर है: आपकी वेबसाइट अब और प्रतिक्रिया नहीं देगी।

आप एक पृष्ठभूमि कार्य कतार का उपयोग करना चाहिए, मूल रूप से 2 प्रक्रियाओं है: अपने सर्वर और एक पृष्ठभूमि कार्य प्रबंधक। सर्वर स्प्रेडशीट की प्रसंस्करण को पृष्ठभूमि कार्य प्रबंधक पर प्रस्तुत करना चाहिए। जब पृष्ठभूमि कार्य किया जाता है, तो उसे सर्वर को किसी भी तरह सूचित करना चाहिए। उदाहरण के लिए, यह model_with_spreadsheet.processed = datetime.datetime.now() कर सकता है।

आप (आपके मामले में बहुत शक्तिशाली है, शायद overkill) एक पृष्ठभूमि काम प्रबंधकdjango-ztask की तरह (बहुत आसान सेटअप), celeryका उपयोग करना चाहिए या यहाँ तक कि uwsgi spooler (जो स्पष्ट रूप से uwsgi तैनाती की आवश्यकता है)।

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद। आपके और क्रिस्टोफे 31 के जवाबों के आधार पर, मुझे लगता है कि मुझे थोड़ा और नींद आने के बाद सेलेरी की जांच होगी। – dino

+0

प्रश्न को बंद करें – jpic

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