2011-08-10 15 views
9

को स्थानीयहोस्ट पर चलने वाला एक django dev सर्वर मिला: 8000 और स्थानीयहोस्ट पर एक नोडजेस सर्वर: 3000। मैं NodeJS सर्वर में json आयात करना चाहते हैं, लेकिन मैं इस त्रुटि हो रही है:django tastypie और cross domain json

XMLHttpRequest cannot load http://127.0.0.1:8000/api/presentation/?format=json . Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin

यह अपने क्रॉस-डोमेन मज़ा में प्रथम प्रयास तो मैं रास्ता मेरी गहराई से बाहर कर रहा हूँ है।

मैंने इसे नोड (एक्सप्रेसजे) में अपने मार्गों में जोड़ा है।

app.all('/', function(req, res){ 
    res.header("Access-Control-Allow-Origin", "*"); 
    res.header("Access-Control-Allow-Headers", "X-Requested-With"); 
    res.render('index', { 
    title: '...' 
    }); 
}); 

मुझे क्या याद आ रही है/गलत कर रहा है?

उत्तर

10

डेटा प्रदाता क्रॉस डोमेन अनुरोध के लिए एक नीति सेट करने की जरूरत है (आपके expressjs के टुकड़े के रूप में नहीं ग्राहक, पता चलता है)।

Someone एक सरल Django मिडलवेयर के साथ एक सार पोस्ट की जरूरत हेडर इंजेक्शन लगाने की देखभाल:

Middlware to allow's your django server to respond appropriately to cross domain XHR (postMessage html5 API).

+0

काम किया! बहुत धन्यवाद: डी –

+2

मैं जिस्ट का उपयोग कर रहा हूं, लेकिन मेरे लिए काम नहीं करता है। एक साधारण jquery के माध्यम से django/पायथन बैकएंड द्वारा खुलासा एक साधारण जेसन लोड करने की कोशिश कर रहा है। मैं $ .getJSON विधि का भी उपयोग कर रहा हूं। और मेरे midwares सेटिंग्स में उल्लिखित midware भी जोड़ा है। संभवतः गलत क्या हो सकता है? कोई विशिष्ट क्रम जिसमें मिडलवेयर जोड़ा जाना है? या क्या मुझे प्रत्येक प्रतिक्रिया में हेडर सेट करने की ज़रूरत है?(ऐसा लगता है कि मिडलवेयर का कोड नहीं दिख रहा है)। या क्या मुझे json mimetype के साथ काम करने के लिए इसे संशोधित करने की आवश्यकता है? अग्रिम में धन्यवाद। – sbidwai

+0

मुझे लगता है कि दोनों प्रतिक्रियाओं और अनुरोधों में सेटिंग शीर्षलेख आवश्यक है। यह अद्यतन Gist https://gist.github.com/1369619 –

1

आप हो सकता था भी

http://127.0.0.1:8000/api/presentation/?format=jsonp 
+1

शानदार है! लेकिन मैं कॉलबैक नाम को कैसे अनुकूलित कर सकता हूं? – user507410

+0

में यूआरएल में 'कॉलबैक' पैरामीटर शामिल है। 'Http: //127.0.0.1: 8000/API/प्रस्तुति प्रारूप = jsonp और कॉलबैक = foo'। – Jimothy

6
तरह JSONP इस्तेमाल किया

https://gist.github.com/426829 - यह टुकड़ा वास्तव में उपयोगी लेकिन रीढ़ की हड्डी का उपयोग कर सर्वर मैं था django के लिए पोस्ट की प्रतिक्रिया पर पहुंच-नियंत्रण-अनुमति दें-हेडर साथ पहुंच-नियंत्रण-अनुरोध-हेडर अनुरोध पर हैडर से मिलान करने कर रहा था।

कॉफी:

auth = (xhr) -> 
xhr['xhrFields']= {withCredentials: true} 
xhr.setRequestHeader('Access-Control-Allow-Credentials', 'true') 
xhr.header('Access-Control-Allow-Origin', "*") 
xhr.header('Access-Control-Allow-Methods', 'GET,POST,PUT,HEAD,DELETE,OPTIONS') 
xhr.header('Access-Control-Allow-Headers', 'Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control') 

अजगर: एक अतिरिक्त लाइन

def process_request(self, request): 

    if 'HTTP_ACCESS_CONTROL_REQUEST_METHOD' in request.META: 
     response = http.HttpResponse() 
     response['Access-Control-Allow-Origin'] = XS_SHARING_ALLOWED_ORIGINS 
     response['Access-Control-Allow-Methods'] = ",".join(XS_SHARING_ALLOWED_METHODS) 
     response['Access-Control-Allow-Headers'] = "Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control" 
     return response 

    return None   

होप के साथ https://gist.github.com/426829 इस उपयोगी है!

+0

इस उत्तर को अधिक वोटों की आवश्यकता है। –

0

डेटा सेट करना: AJAX POST कोड में 'jsonp' के बजाय 'text' मेरे लिए काम किया।

1

This gist एक स्वादिष्ट पाई संसाधन बेस क्लास है। यह उप-संसाधन उप-वर्ग होगा जो क्रॉस-डोमेन पहुंच योग्य होगा।

यह दूसरों के समान है लेकिन सीओआरएस हेडर को में respones को दे सकता है। यह त्रुटि प्रतिक्रियाएं और ImmediateHttpResponse अपवाद भी शामिल

from tastypie.resources import Resource 
from tastypie.exceptions import ImmediateHttpResponse 
from django.http import HttpResponse 


class CorsResource(Resource): 

    """ adds CORS headers for cross-domain requests """ 

    def patch_response(self, response): 

     allowed_headers = ['Content-Type', 'Authorization'] 

     response['Access-Control-Allow-Origin'] = '*' 
     response['Access-Control-Allow-Headers'] = ','.join(allowed_headers) 
     return response 

    def dispatch(self, *args, **kwargs): 
     """ calls super and patches resonse headers 
      or 
      catches ImmediateHttpResponse, patches headers and re-raises 
     """ 

     try: 
      response = super(CorsResource, self).dispatch(*args, **kwargs) 
      return self.patch_response(response) 
     except ImmediateHttpResponse, e: 
      response = self.patch_response(e.response) 
      # re-raise - we could return a response but then anthing wrapping 
      # this and expecting an exception would be confused 
      raise ImmediateHttpResponse(response) 

    def method_check(self, request, allowed=None): 
     """ Handle OPTIONS requests """ 
     if request.method.upper() == 'OPTIONS': 

      if allowed is None: 
       allowed = [] 

      allows = ','.join([s.upper() for s in allowed]) 

      response = HttpResponse(allows) 
      response['Allow'] = allows 
      raise ImmediateHttpResponse(response=response) 

     return super(CorsResource, self).method_check(request, allowed) 
+0

यह मेरे लिए काम किया। कक्षा शीर्षलेख में बस संसाधन संसाधन में संसाधन बदल दिया। – PhoebeB

1

इस के लिए एक दोस्ताना और विन्यास Django मॉड्यूल है: django-cors-headers

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