2012-09-14 10 views
10

समझाया गया है मुझे कभी-कभी यह सुनिश्चित नहीं होता कि webapp2.redirect का उपयोग कैसे किया जाए।वेबएप 2 रीडायरेक्ट

वहाँ कभी एक समय था जब मैं self.redirect("/blah") बजाय return self.redirect("/blah")

यहाँ मेरी समझ/समय-रेखा का अनुमान है का उपयोग करना चाहिए है: (कभी कभी मैं भ्रमित कर रहा हूँ के बारे में प्रतिक्रिया ऑब्जेक्ट कुछ करता है, तो या webapp2 अगर यह)

  1. मैं अपने बहु वेबसाइट www.mysite.com/name/robert पर जाते हैं, क्रोम एक ( अनुरोध प्राप्त करने देता है एक पाठ फ़ाइल इस अनुरोध को मान रहा है)
  2. webapp2 इस "टेक्स्ट" पकड़ लेता है भेजता करता है और इसे बदल देता है एक webapp2.Request। वेबपैप 2 भी एक नया webapp2 बनाता है। प्रतिक्रिया।
  3. किसी भी तरह से अनुरोध के लिए राउटर को अनुरोध url दिया जाता है (या तो वेबपै 2 द्वारा या प्रतिक्रिया द्वारा)। एक उपयुक्त अनुरोध हैडलर तत्काल है। RequestHandler की get() विधि को उचित तर्क के साथ बुलाया जाता है।
  4. इस समय पूरे समय केवल एक अनुरोध और एक प्रतिक्रिया हुई है।
  5. get() विधि प्रतिक्रिया.out.write ("हैलो वर्ल्ड") प्रतिक्रिया शरीर को "हैलो वर्ल्ड" जोड़ती है?
  6. प्राप्त() विधि self.redirect कॉल ('/ foo')
  7. सामग्री
  8. प्राप्त() होता है विधि self.out.write कॉल ("अलविदा दुनिया")
  9. प्रतिक्रिया हैलो दुनिया युक्त ग्राहक के लिए भेज दिया जाता है, क्या खाना, जोड़ा प्रारंभिक प्राप्त समारोह के अलविदा दुनिया

उदाहरण:

def get(): 
    self.write('hello world') 
    self.redirect('/foo') 
    self.write('bye world') 

क्या "सामान होता है"? मुझे लगता है कि राउटर पाता है/foo/requestHandler। foo के अनुरोध से पहले अनुरोध और प्रतिक्रिया में क्या संशोधन किए गए हैं हैंडलर() विधि को कहा जाता है। क्या अनुरोध हटा दिया गया है और एक नए जीईटी अनुरोध द्वारा प्रतिस्थापित किया गया है? क्या प्रतिक्रिया हटा दी गई है और एक नए द्वारा प्रतिस्थापित किया गया है? प्रारंभिक अनुरोध हैंडलर में मौजूद कौन सा संदर्भ बनी हुई है? कोड निष्पादन प्रारंभिक अनुरोध हैंडलर पर वापस आता है विधि और यदि ऐसा संदर्भ है जो पुनर्स्थापित किया गया हो सकता है?

क्षमा करें यह एक कौर का एक सा है, तो मैं समझा क्या मुझे पता है :)

चाहते की कोशिश की है शायद यह (कर के और don'ts) के कुछ उपयोग के मामलों के लिए पूछने के लिए आसान हो गया होता इसके बजाय पुनर्निर्देशन का उपयोग कर।

उत्तर

10

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

स्रोत काफी पढ़ने में आसान है .. http://webapp2.readthedocs.io/en/latest/_modules/webapp2.html#redirect

+0

तो ग्राहक 302 हो जाता है और पुन: निर्देशन इस प्रकार है। यह अक्षम लगता है (एक के बजाय दो अनुरोधों की आवश्यकता है)।अगर सभी को रीडायरेक्ट/लॉगिन करने के लिए रीडायरेक्ट किया जाता है, तो मैंने सोचा होगा कि प्रतिक्रिया लॉगिन फॉर्म लौटाएगी और कहेंगी कि इसे दो की बजाय एक प्रतिक्रिया में रीडायरेक्ट किया गया था। –

+1

बस पुष्टि करने के लिए, foos get() विधि तब तक नहीं बुलाया जाता है जब तक क्लाइंट ब्राउज़र रीडायरेक्ट के बाद नए स्थान शीर्षलेख के नए अनुरोध के साथ रीडायरेक्ट का पालन नहीं करता है जिसका अर्थ है कि फ़ॉस प्राप्त करने के तरीके को एक अलग सर्वर पर भी कहा जा सकता है। –

+1

यदि आप एक आंतरिक रीडायरेक्ट चाहते हैं, तो आप अपने कोड से एक और हैंडलर विधि कॉल कर सकते हैं, उदाहरण के लिए मैं एक पोस्ट हैंडलर में कुछ अपडेट करूंगा और प्रतिक्रिया के रूप में self.get() वापस कर दूंगा। मुद्दा यह है कि आप सर्वर से पूछे गए एक अलग संसाधन से सामग्री वापस कर रहे हैं। यदि स्थिति के लिए यह ठीक है, तो ठीक है। यदि आप रीडायरेक्ट करते हैं तो ब्राउजर (या स्पाइडर) जानता है कि यह क्या हो रहा है। पुनर्निर्देशन और नई प्रतिक्रिया प्रदान करने के लिए, अच्छी तरह से ब्राउज़र इस तरह से काम नहीं करते हैं। पुष्टि करने के लिए: हाँ, और आप ईथर के लिए "हैलो वर्ल्ड" और "अलविदा" खो देंगे (ब्राउज़र उपयोगकर्ता को) – lecstor

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