2016-02-07 11 views
5

मैं जो वर्ग है एक सरल बवंडर सर्वर है:तूफान सर्वर: सक्षम CORS का अनुरोध करता है

class BaseHandler(tornado.web.RequestHandler): 
    def set_default_headers(self): 
     print "setting headers!!!" 
     self.set_header("Access-Control-Allow-Origin", "*") 

जब एक नियमित रूप से (कोई CORS) का अनुरोध किया जाता है, उम्मीद के रूप में सर्वर जवाब, प्रवेश-Control-सहित अनुमति दें-उत्पत्ति हेडर। लेकिन जब मैं अलग-अलग डोमेन से आने वाले एक पोस्ट अनुरोध (jQuery.post का उपयोग करके) करता हूं, तो प्रतिक्रिया 404 होती है और एक त्रुटि प्रदर्शित होती है: "XMLHttpRequest http://dev-machine:8090/handshake लोड नहीं कर सकता है। अनुरोधित संसाधन पर कोई भी 'एक्सेस-कंट्रोल-अनुमति-उत्पत्ति' शीर्षलेख मौजूद नहीं है। उत्पत्ति 'http://localhost:8090' इसलिए पहुंच की अनुमति नहीं है। प्रतिक्रिया में HTTP स्थिति कोड 404 था। "

क्या आप बता सकते हैं कि मुझे कुछ याद आ रहा है? (एक अन्य शीर्षलेख/अन्य विन्यास/कुछ और)

+0

कि' pass' ज़रूरत से ज़्यादा/गलत है –

उत्तर

21

आपके कोड में प्रीफलाइट, OPTIONS अनुरोध गुम है।

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS:

नया HTTP हेडर कि सर्वर मूल हैं कि के सेट का वर्णन करने के लिए अनुमति जोड़कर पार ओरिजिन रिसोर्स शेयरिंग मानक काम करता है वेब ब्राउज़र का उपयोग कि जानकारी को पढ़ने के लिए अनुमति दी। इसके अतिरिक्त, HTTP अनुरोध विधियों के लिए जो उपयोगकर्ता डेटा पर दुष्प्रभाव पैदा कर सकता है ( विशेष रूप से, जीईटी के अलावा HTTP विधियों के लिए, या कुछ एमआईएम प्रकारों के साथ POST उपयोग के लिए), विनिर्देश जरूरी है कि ब्राउज़र अनुरोध "प्रीफलाइट" , एक HTTP विकल्प अनुरोध विधि के साथ सर्वर से समर्थित विधियों की मांग, और फिर, सर्वर से "अनुमोदन" पर, वास्तविक HTTP अनुरोध विधि के साथ वास्तविक अनुरोध भेजना। सर्वर ग्राहकों को सूचित भी कर सकते हैं कि "क्रेडेंशियल्स" (कुकीज़ और HTTP प्रमाणीकरण डेटा समेत) अनुरोधों के साथ भेजा जाना चाहिए।

प्रीफलाइट हैंडलर को लागू करने के लिए बस एक ही शीर्षलेख और कोई शरीर के साथ विकल्प हैंडलर जोड़ें।

class BaseHandler(tornado.web.RequestHandler): 

    def set_default_headers(self): 
     print "setting headers!!!" 
     self.set_header("Access-Control-Allow-Origin", "*") 
     self.set_header("Access-Control-Allow-Headers", "x-requested-with") 
     self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS') 

    def post(self): 
     self.write('some post') 

    def get(self): 
     self.write('some get') 

    def options(self): 
     # no body 
     self.set_status(204) 
     self.finish() 

संपादित

मैं x-requested-with हेडर जोड़ दिया है की अनुमति दी सूची में। - http://dev.housetrip.com/2014/04/17/unleash-your-ajax-requests-with-cors/

+0

इसका मतलब यह है कि मैं अपने जे एस पोस्ट को बदलने और बनाने चाहिए। एक "विकल्प" अनुरोध? – benams

+1

मैंने नमूने जोड़े हैं। मूल रूप से प्रीफलाइट हुड के नीचे ब्राउज़र द्वारा किया जाता है। – kwarunek

+0

हाँ, मैंने यह टिप्पणी पोस्ट करने के बाद इसे पाया। धन्यवाद, यह वास्तव में सहायक था! – benams

4

kwarunek द्वारा जवाब मुझे डाल दिया और हटाने का अनुरोध के साथ मेरी परेशानी के लिए समाधान के लिए नेतृत्व किया

$.ajax({ 
    url: "http://some_tornado/api", 
    type: "POST", 
    crossDomain: true, 
    data: 'some_data', 
    success: function (response) { 
    alert(response); 
    }, 
    error: function (xhr, status) { 
    alert("error"); 
    } 
}); 

और CORS के बारे में वास्तव में कुछ अच्छे लेख: और यहाँ सरल jQuery नमूना है। एकमात्र चीज यह है कि समाधान जीईटी और पोस्ट के साथ उदाहरण के लिए उपयुक्त है। इस मामले में लाइन

self.set_header("Access-Control-Allow-Origin", "*") 

(ब्राउज़र से पहले सभी CORS ब्लॉक नहीं करता है तो) वास्तव में पर्याप्त है। हालांकि यह PUT और DELETE अनुरोधों के लिए सबसे प्रासंगिक है। नेटवर्क स्तर पर क्या होता है जीईटी/पोस्ट मामले की तुलना में थोड़ा अधिक जटिल हो सकता है।

"अगर अनुरोध एक" गैर-सरल "अनुरोध है, तो ब्राउज़र पहले डेटा-कम" प्रीफलाइट "विकल्प अनुरोध भेजता है, यह सत्यापित करने के लिए कि सर्वर अनुरोध स्वीकार करेगा। अनुरोध का उपयोग करते समय एक अनुरोध सरल नहीं है जीईटी या पोस्ट के अलावा HTTP क्रिया (जैसे पुट, हटाएं)।"cf. non-simple requests

class BaseHandler(tornado.web.RequestHandler): 

    def set_default_headers(self): 
     print("setting headers!!!") 
     self.set_header("Access-Control-Allow-Origin", "*") 
     self.set_header("Access-Control-Allow-Headers", "x-requested-with") 
     self.set_header('Access-Control-Allow-Methods', ' PUT, DELETE, OPTIONS') 

    def options(self): 
     # no body 
     self.set_status(204) 
     self.finish() 

अब सभी संचालकों कि BaseHandler से विरासत को पूरी तरह से CORS-सक्षम हैं:

class MyHandler(BaseHandler): 

    def put(self): 
     self.write('some post') 

    def delete(self): 
     self.write('some get') 
संबंधित मुद्दे