2011-02-08 15 views
7

मैं टोरनाडो के लिए RequestHandler में get_current_user को लागू करने का प्रयास कर रहा हूं, लेकिन मुझे अपने डेटाबेस में एसिंक्रोनस कॉल पर प्रतीक्षा करते समय ब्लॉक करने के लिए कॉल की आवश्यकता है। @ Tornado.web.asynchronous के साथ सजावट कॉल काम नहीं करेगा क्योंकि async क्वेरी पूर्ण होने से पहले get_current_user विधि वापस आती है और क्वेरी कॉलबैक निष्पादित किया जाता है।टोरनाडो असिंक्रोनस हैंडलर

उदाहरण के लिए:

class MyHandler(BaseHandler): 
    @tornado.web.asynchronous 
    @tornado.web.authenticated 
    def get(self): 
    self.write('example') 
    self.finish() 

class BaseHandler(tornado.web.RequestHandler): 
    def get_current_user(self): 
    def query_cb(self, doc): 
     return doc or None 

    database.get(username='test', password='t3st', callback=query_cb) 

@ tornado.web.authenticated कॉल get_current_user, लेकिन हमेशा "कोई नहीं" प्राप्त करता है क्योंकि BaseHandler समय प्रतिक्रिया करने के लिए नहीं है। क्या उपरोक्त एक कॉल के लिए अस्थायी रूप से अवरुद्ध करने के लिए, बवंडर का उपयोग करके कोई रास्ता है?

उत्तर

4

ऊपर वर्णित गैर अवरोधन के बजाय अवरुद्ध डेटाबेस ऑपरेशन करें (एक अवरुद्ध mysql lib को टर्ननाडो के साथ भेज दिया गया है)।

टॉरनाडो विकी पेज से धागे और समरूपता के बारे में पृष्ठ: "इसे सिंक्रनाइज़ करें और IOLoop को अवरुद्ध करें। यह आपके नियंत्रण में मौजूद मेमकेचे और डेटाबेस क्वेरी जैसी चीजों के लिए सबसे उपयुक्त है और हमेशा तेज़ होना चाहिए। यदि यह तेज़ नहीं है , डेटाबेस में उपयुक्त इंडेक्स जोड़कर इसे तेज़ी से बनाएं, आदि "

https://github.com/facebook/tornado/wiki/Threading-and-concurrency

+0

मैं मूल रूप से पूछ रहा हूं कि बवंडर स्तर पर अवरुद्ध करने का कोई तरीका है क्योंकि कॉचडब के लिए मेरा डेटाबेस एपीआई असीमित है और इसमें कोई गैर-अवरुद्ध कॉल नहीं है। मैं इस एकल ऑपरेशन को छोड़कर बाकी साइट के लिए इसे पसंद करता हूं। यही कारण है कि मैं पूछ रहा हूँ। – Jarrod

+1

एक समाधान: http://pastie.org/private/v6fwon5rryacjavna2o0w – Schildmeijer

+0

दूसरा: http://code.google.com/p/couchdb-python/ – Schildmeijer

-1

मैंने सोचा था कि तूफान आप या तो अवरुद्ध या गैर अवरुद्ध अनुरोध करने की अनुमति दी।

यहाँ तूफान दोनों के लिए प्रयोग किया जाता है किया जा रहा: https://bitbucket.org/nephics/tornado-couchdb/src/147579581b47/couch.py

अस्वीकरण: मैं अजगर और तूफान की बहुत कम जानते हैं।

0

get_current_userFuture वापस करने के बारे में बताते हैं कि जब आप अपने डेटाबेस से एसिंक्रोनस प्रतिक्रिया लौटाते हैं तो आपको संकेत मिलता है?

class BaseHandler(tornado.web.RequestHandler): 
    def get_current_user(self): 
     future = Future() 
     def query_cb(user): 
      future.set_result(user or None) 
     database.get(username='test', password='t3st', callback=query_cb) 
     return future 


class MainHandler(BaseHandler): 
    @gen.coroutine 
    def get(self): 
     user = yield self.get_current_user() 
     self.write('user: ' + user) 
     # ... actual request processing 
संबंधित मुद्दे