django - एक्स्टजेएस 5 एप्लिकेशन+जेगो बाकी ढांचा कॉरस त्रुटि जब स्टोर के यूआरएल बदलते हैं




extjs cors django-rest-framework django-cors-headers (2)

मैं एक एक्स्टजेएस अनुप्रयोग विकसित कर रहा हूं जो एक डीजेंगो-बाकी-फ्रेमवर्क सेवा का उपयोग करता है मैं सेवा ( https://github.com/OttoYiu/django-cors-headers ) से डेटा लाने की अनुमति देने के लिए CORS हेडर का उपयोग कर रहा हूं।

क्या होता है एक समय में मैं दुकान से यूआरएल बदलना चाहता हूं। और जब मैं ऐसा करता हूं मुझे निम्न त्रुटि मिलती है:

XMLHttpRequest cannot load http://10.98.0.241:8000/reacsearch/as?_dc=1418831884352&page=1&start=0&limit=25. The request was redirected to 'http://10.98.0.241:8000/reacsearch/as/?_dc=1418831884352&page=1&start=0&limit=25', which is disallowed for cross-origin requests that require preflight.

Settings.oy में मैं कॉरस के लिए निम्न गुणों को परिभाषित करता हूं I

CORS_ALLOW_METHODS = (
        'GET',
        'OPTIONS'
    )

CORS_ORIGIN_ALLOW_ALL = True

यह ठीक काम करता है जब मैं अपने डेटाबेस में सभी तत्वों की सूची के लिए यूआरएल का उपयोग करता हूं, लेकिन जब मैं एक और यूआरएल के लिए स्टोर बदलता हूँ तो मुझे ऊपर त्रुटि मिलती है इसके अलावा ब्राउज़र में लिंक ठीक काम करता है

स्टोर यूआरएल परिवर्तन इस तरह से किया जाता है:

var store = Ext.getStore(storeName);
store.getProxy().setUrl(newURL);
store.load();

विचारों के बीच का अंतर, यह है कि आवेदन पर काम करने वाले दो विचार हैं, जबकि दूसरा सिर्फ एक सामान्य सूची है

class Example1viewset(viewsets.ModelViewSet):
    """
    API endpoing that allows metabolites to be viewed.
    """
    queryset = examples1.objects.all()
    serializer_class = Example1Serializer

class Example1SearchList(generics.ListAPIView):
    serializer_class = Example1Serializer

    def get_queryset(self):
        queryset = Example.objects.all()

        if 'attr' in self.kwargs:
            queryset = queryset.filter(Q(attribute1__contains=self.kwargs['attr']) | Q(attribute2__contains=self.kwargs['abbr']))

        return queryset

जैसा कि मैंने उल्लेख किया है कि दोनों उदाहरण ब्राउज़र में ठीक काम करते हैं (नेटवर्क में अन्य कंप्यूटरों के माध्यम से भी प्रवेश करते हैं), हालांकि, अनुप्रयोग में जब स्टोर के URL को बदलते हैं, तो मुझे कॉरस त्रुटि मिलती है। क्या किसी के पास कोई विचार है कि ऐसा क्यों हो रहा है?

धन्यवाद।

संपादित करें:

बस स्पष्टीकरण के लिए, समस्या स्टोर के यूआरएल को बदलने में नहीं है। जैसा कि मैंने उन यूआरएलों को चूक के रूप में स्थापित करने की कोशिश की, लेकिन वे आवेदन से पहुंचते समय काम नहीं कर रहे हैं।

मेरा urls.py फ़ाइल:

router = routers.DefaultRouter()
router.register(r'example', views.Example1ViewSet)

# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
    url(r'^', include(router.urls)),
    url(r'^reacsearch/(?P<attr>.+)/$', Example1SearchList.as_view()),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))

क्या यह हो सकता है कि समस्या इस तथ्य से जुड़ी है कि मैं रूटर में खोज सूची को नहीं जोड़ रहा हूं?

EDIT2

चूंकि मैं किसी भिन्न डोमेन से डेटा प्राप्त करने की कोशिश कर रहा था, इसलिए समस्या हल हुई मैंने स्टोर के प्रकार को एक्स्टजेस में jsonp में परिवर्तित कर दिया है, और मैंने भी अपने बाकी सेवा को jsonp के रूप में डेटा प्रस्तुत करने की अनुमति दी है।

सिर्फ एक अनुस्मारक अगर कोई भी इस समस्या में आता है, तो यह स्टोर के यूआरएल में format = jsonp जोड़ना आवश्यक है:

http://my/url/?format=jsonp

Answers

चूंकि यह एक वैकल्पिक समाधान की तरह दिखता है, इसलिए मैं यह समझाऊंगा कि समस्या क्या है और साथ ही वैकल्पिक काम क्यों करती है।

XMLHttpRequest first url लोड नहीं कर सकता। अनुरोध को ' second url ' पर पुनः निर्देशित किया गया था, जिसे क्रॉस-मूल अनुरोधों के लिए अनुमति नहीं दी जाती है जिसके लिए प्रीफलाइट की आवश्यकता होती है।

यहां मुद्दा यह है कि आप जेन्गो को अनुगामी स्लैश को लागू करने के लिए कह रहे हैं, जो यूआरएल को बिना किसी पिछली स्लैश के यूआरएल को अनुक्रमित स्लैश के साथ रीडायरेक्ट करता है, यह मानते हुए कि कोई मौजूद है। इस कारण, जैसा कि त्रुटि में कहा गया है, अनुरोध को दूसरी यूआरएल पर भेजा गया था, जिसे आप बता सकते हैं कि लापता अनुगामी स्लैश है। यह APPEND_SLASH द्वारा नियंत्रित है APPEND_SLASH Django सेटिंग जो डिफ़ॉल्ट रूप से True है

समस्या यह है कि जब CORS एक प्रीफलाइट अनुरोध कर रहा है, जो कि यह निर्धारित करने की अनुमति देता है कि क्या अनुरोध किया जा सकता है, अनुरोधित यूआरएल पर एक मान्य प्रतिक्रिया होनी चाहिए। क्योंकि आप अनुरोध पुनर्निर्देशित कर रहे हैं, preflight अनुरोध विफल रहता है और आप अपनी जानकारी के बिना फंस रहे हैं।

आप इसे अपने कोड में अनुगामी स्लैश जोड़कर ठीक कर सकते हैं। यह ext के साथ करने के लिए कुछ समाधान दिखाई देता है, लेकिन मैं व्यक्तिगत रूप से एक विशिष्ट एक की सिफारिश नहीं कर सकता आप ट्रेलिंग स्लैश का उपयोग करने के लिए मैन्युअल रूप से यूआरएल को भी सेट कर सकते हैं, जो आपको पहले से कर रहे थे।

या आप JSONP का उपयोग कर सकते हैं ...

आपको वैकल्पिक समाधान मिला है, जो सीओआरएस पर भरोसा करने के बजाय अनुरोध करने के लिए JSONP का उपयोग करना है। यह प्रीफलाइट मुद्दे के आसपास और सभी प्रमुख ब्राउज़रों में काम करता है, पर विचार करने के लिए कुछ कमियां हैं। चारों ओर देखकर आप सीओआरएस बनाम JSONP पर अधिक जानकारी पा सकते हैं।

यदि आप अपने एपीआई में किसी भी बदलाव को पुश करना चाहते हैं, तो आपको कॉरस की ज़रूरत है, क्योंकि जेएसओएनपी केवल अनुरोधों का समर्थन करता है। अन्य फायदे हैं, जैसे अनुरोध को रद्द करने की क्षमता, जो कॉरस के साथ भी आता है।


मुझे लगता है कि autoEl वह है जिसे आप ढूंढ रहे हैं ...

मेरे द्वारा कुछ सलाह, Ext 4.x में autoEl को window कॉन्फ़िगरेशन प्रॉपर्टी के रूप में उपयोग नहीं करते हैं, यह आपकी विंडो को विकृत कर सकता है .. मेरा सुझाव है कि आप एक component (अपनी विंडो के आइटम) में autoEl का उपयोग करें।

new Ext.Window({
    title : "iframe",
    width : 300,
    height: 300,
    layout : 'fit',
    items : [{
        xtype : "component",
        autoEl : {
            tag : "iframe",
            src : "http://www.yahoo.com"
        }
    }]
}).show();

उपरोक्त कोड से बेहतर है

new Ext.Window({
    title : "iframe",
    width : 300,
    height: 300,
    layout : 'fit',
    autoEl : {
       tag : "iframe",
       src : "http://www.yahoo.com"
    }
}).show();

नोट: वर्तमान में आप एक आईफ्रेम के अंदर Google और फेसबुक लोड नहीं कर सकते हैं





django extjs cors django-rest-framework django-cors-headers