2012-09-02 8 views
8

मैं अपने तूफान वेब सर्वर के लिए निम्नलिखित का उपयोग मामला है:तूफान वेब में अनुरोधों के बीच डाटा साझा करने के लिए कैसे

पोस्ट अनुरोध प्रविष्टियों सर्वर से बनाया जा सकता है पर, प्रविष्टियों जो एक फ़ाइल या डेटाबेस के लिए कायम नहीं की जाएगी । अनुरोध प्राप्त करने पर एक प्रक्रिया शुरू या समाप्त की जा सकती है।

इसलिए मुझे अपने RequestHandler कार्यान्वयन में विभिन्न अनुरोधों के बीच डेटा साझा करने की आवश्यकता है। ऐसा करने का सामान्य तरीका क्या है?

मुझे पर डेटा सहेजने में कठिनाई थी, उदाहरण के लिए self.entry = "..."। एक अन्य अनुरोध में डेटा अब मौजूद नहीं था।

केवल काम कर समाधान मैंने पाया स्टोर करने के लिए है कि आवेदन वस्तु में है:

application = web.Application([ 
      (r'.*', MainHandler, 
      ]) 

और

def get(self): 
     # ... 
     self.application.entry = "..." 

कि उचित तरीका है? यहां सिंक्रनाइज़ेशन के बारे में भी, मेरा मतलब है कि इसका मतलब साझा डेटा तक पहुंच है।

उत्तर

15

मैं निम्नलिखित सुझाव: एक डेटाबेस का उपयोग वस्तु के बजाय उदाहरण के लिए, एक वस्तु जो आपके डेटा को संगृहीत पारित:

data = DataStore() 

application = web.Application([ 
     (r'.*', MainHandler, dict(data = data), 
     ]) 
निम्नलिखित RequestHandler प्रारंभ विधि के साथ

def initialize(self, data): 
    self.data = data 

आपको ऑब्जेक्ट बनाने से पहले इसे पास करना होगा, अन्यथा यह अनुरोध हर बार संसाधित हो जाएगा।

+2

मैं टोरनाडो से परिचित नहीं हूं, लेकिन ध्यान रखें कि यदि आप एक से अधिक प्रक्रियाओं का उपयोग कर रहे हैं तो यह शायद काम नहीं करेगा। – monkut

+0

@monkut क्या, सर्वर, क्लाइंट के लिए एक से अधिक प्रक्रियाओं? –

+2

टोरनाडो एक एकल प्रक्रिया, एकल थ्रेडेड सर्वर है ... यह काम करेगा। – oDDsKooL

0

आप इस तरह के कुछ के लिए memcached का उपयोग कर सकते हैं। हालांकि, आपको memcached सर्वर सेट अप करने की आवश्यकता होगी।

http://pypi.python.org/pypi/python-memcached/

+2

क्या यह थोड़ा सा ओवरकिल नहीं है? मैं बस चल रहे आवेदन के समय के लिए 2 वस्तुओं को स्टोर करना चाहता हूं। – RevMoon

1

आवेदन की दुकान (अर्ध) लगातार डेटा का अधिकार वस्तु है। हालांकि, जैसा कि अन्य anwser पर सुझाया गया है, आपको इस डेटा को स्टोर करने के लिए किसी प्रकार का डेटाबेस उपयोग करने पर विचार करना चाहिए।

हालांकि, आपको ध्यान रखना चाहिए कि एक सत्र (या लेनदेन) ठीक से खत्म नहीं होता है (उदाहरण के लिए आपको एक पोस्ट मिलता है लेकिन कार्रवाई को ट्रिगर करने के लिए कोई भी प्राप्त नहीं होता है), आपको सत्र डेटा को हटाना चाहिए ताकि आपके पास न हो वेबसर्वर रिसाव स्मृति।

मेरे अनुभव से, मैं Redis का उपयोग करने का सुझाव देना चाहता हूं क्योंकि इसका उपयोग करना आसान है और key expiration का समर्थन करता है, एक तंत्र जो सत्र डेटा प्रबंधित करने की आवश्यकता होने पर आसान होता है।

class MyHandler(RequestHandler): 
    def initialize(self, database): 
     self.database = database 

    def get(self, username): 
     ... 

mydatabase = dict() 

app = Application([ 
    (r'/user/(.*)', MyHandler, dict(database=mydatabase)), 
    ]) 

तो फिर तुम एक फाइल करने के लिए अपने ऑब्जेक्ट mydatabase बचा सकते हैं:

+0

मुझे डेटा को संग्रहीत करने के लिए डेटाबेस का उपयोग क्यों करना चाहिए जिसे मैं जारी रखना नहीं चाहता हूं?डेटा केवल चल रहे वेब सर्वर के समय उपलब्ध होना चाहिए। यदि वेब सर्वर हां दुर्घटनाग्रस्त हो जाता है, तो डेटा को अमान्य किया जाना चाहिए। यदि वेब सर्वर को हां पुनरारंभ करना है, तो डेटा को अमान्य किया जाना चाहिए। – RevMoon

+0

मैं आपको सुनता हूं। इस मामले में आवेदन निश्चित रूप से जाने का तरीका है। आप एप्लिकेशन सत्र में अपने सत्र डेटा को किसी भी कंटेनर में स्टोर कर सकते हैं। मेरी टिप्पणी यह ​​थी कि जब आपकी परियोजना कार्यक्षमता में बढ़ती है, तो किसी तीसरे पक्ष के स्टोर में सत्र डेटा संग्रहीत करना शायद अधिक से अधिक उपयोगी होगा। उदाहरण के लिए एप्लिकेशन मॉनिटरिंग के बारे में सोचें: स्टोर से लाइव सत्र डेटा पर मेट्रिक्स को पुनर्प्राप्त/गणना करना बहुत अच्छा हो सकता है (जैसा कि थर्म सर्वर के विपरीत है) क्योंकि यह आपके सर्वर के प्रदर्शन को परेशान/प्रभावित किए बिना चला जाता है। – oDDsKooL

6

documentation एक तरह से यह करने के लिए देता है।

लेकिन मुझे यकीन नहीं है कि अनुरोधों के बीच सिंक्रनाइज़ेशन के संबंध में आप जो हासिल करना चाहते हैं, उसे हासिल करने का यह सही तरीका है।

+0

मैं अपने डेटा को जारी रखना नहीं चाहता, मैं केवल रनटाइम के दौरान इसे सहेजना चाहता हूं। कोई डेटाबेस चाहता था या यहां जरूरी नहीं है। – RevMoon

+0

जिसे मैं 'डेटाबेस' कहता हूं वह सिर्फ आपका डेटा है, आप किसी भी प्रकार के डेटा स्टोरेज का उपयोग कर सकते हैं। यह रनटाइम के दौरान इसे सहेजने की अनुमति देता है। – pintoch

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

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