2013-05-17 7 views
13

सेट नहीं है IOS के माध्यम से एपीआई कॉल करने के लिए डीजेंगो रेस्ट फ्रेमवर्क का उपयोग कर रहा हूं और मुझे निम्न त्रुटि "सीएसआरएफ विफल: सीएसआरएफ कुकी सेट नहीं है।"डीजेगो आरईएसटी फ्रेमवर्क सीएसआरएफ असफल: सीएसआरएफ कुकी

class LoginView(APIView): 
    """ 
    List all snippets, or create a new snippet. 
    """ 
    @csrf_exempt 
    def get(self, request, format=None): 
     startups = Startup.objects.all() 
     serializer = StartupSerializer(startups, many=True) 
     return Response(serializer.data) 

    @csrf_exempt 
    def post(self, request, format=None): 
     profile = request.POST 
.... 

मैं क्या कर सकता:

यहाँ मेरी Django एपीआई कोड है?

+0

क्या आपने कभी यह पता लगाया है? मैं इसे कभी नहीं मिला। – user798719

+0

[Django Rest Framework csrf को हटाएं] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/30871033/django-rest-framework-remove-csrf) – user3467349

उत्तर

1

जीईटी के लिए, आपको डेटा संशोधित नहीं करना चाहिए, इसलिए एक सीएसआरएफ की आवश्यकता नहीं है।

यदि आप पोस्ट के साथ डेटा संशोधित कर रहे हैं, तो आप सत्र आधारित प्रमाणीकरण का उपयोग कर रहे हैं तो आपको एक सीएसआरएफ होना चाहिए। अन्यथा, आप एक सुरक्षा छेद खोल रहे हैं। भले ही आपको लगता है कि आपका Django सर्वर आईफोन ऐप्स की सेवा करने जा रहा है, फिर भी आपके ऐप के साथ किसी को अपने सर्वर पर यातायात पर पैकेट को सूँघने से रोकने के लिए कुछ भी नहीं है, और उसके बाद अन्य प्रकार के वेब क्लाइंट के साथ सर्वर तक इंजीनियरिंग पहुंच को उलट देता है। इस कारण से, कुछ मामलों में डीजेगो रेस्ट फ्रेमवर्क को सीएसआरएफ की आवश्यकता होती है। इसका उल्लेख Django rest framework documentation में किया गया है।

POST के लिए इस आवश्यकता के आस-पास का पथ सत्र प्रमाणीकरण का उपयोग नहीं करना है। उदाहरण के लिए, आप HTTPS पर BasicAuthentication का उपयोग कर सकते हैं। इस प्रमाणीकरण तंत्र के साथ, आपको प्रत्येक अनुरोध के साथ स्पष्ट रूप से पारित होने से रोकने के लिए HTTPS का उपयोग करना चाहिए।

+0

> हमारे ऐप यातायात पर पैकेट को स्नीफ करने से - ऐप, इसलिए नहीं यही कारण नहीं है। – user3467349

+0

यदि आप सीएसआरएफ को अक्षम करने के जोखिम से ठीक हैं क्योंकि आपको नहीं लगता कि आपके पैकेट असुरक्षित हैं और इसमें कोई ब्राउज़र शामिल नहीं है, तो आपको @Rahul Gupta-Iwasaki से समाधान का प्रयास करना चाहिए –

11

यदि कोई भी इस प्रश्न का पालन कर रहा है, तो सीधे जवाब यह है कि आपको व्यंजन विधि को दृश्य विधि पर ही उपयोग करने की आवश्यकता है। get और postAPIView कक्षा पर परिभाषित विधियों को केवल डीआरएफ को बताएं कि वास्तविक दृश्य कैसे व्यवहार करना चाहिए, लेकिन डीजैगो राउटर की अपेक्षा की जाने वाली दृश्य विधि वास्तव में तत्काल नहीं होती है जब तक कि आप LoginView.as_view() पर कॉल न करें।

इस प्रकार, समाधान csrf_exempt सजावट urls.py में जोड़ना है।

#file: urls.py 

from django.conf.urls import patterns, url 
from django.views.decorators.csrf import csrf_exempt 

import views 

urlpatterns = patterns('', 
    url('^login/$', csrf_exempt(views.LoginView.as_view())), 
    ... 
) 

हालांकि, के रूप में मार्क बताते हैं इसके बाद के संस्करण, CSRF संरक्षण का अपहरण कर लिया जा रहा से अपने सत्र को रोकने के लिए महत्वपूर्ण है: यह ऐसा नज़र आ सकता। मैंने स्वयं आईओएस के साथ काम नहीं किया है, लेकिन मैं django के cookie-based csrf tokens का उपयोग करने में देखता हूं। आप ensure_csrf_cookie सजावट का उपयोग कर सकते हैं ताकि django प्रतिक्रिया के साथ csrftoken कुकी भेज सके, और आपके POST अनुरोध तब तक मान्य होंगे जब तक कि आप टोकन को X-CSRFToken शीर्षलेख के रूप में शामिल नहीं करेंगे।

0

यह एक पुराना सवाल है लेकिन कुछ हाल ही में हमने भाग लिया।

डीआरएफ सत्र प्रमाणीकरण का उपयोग करते समय डिफ़ॉल्ट रूप से सीएसआरएफ को अक्षम करता है। डिफ़ॉल्ट रूप से कुकीज़ को संभालने के लिए NSURL कनेक्शन सेट अप किया जाता है। कुकीज का उपयोग न करने के लिए आपको आईओएस ऐप को स्पष्ट रूप से बताना होगा। फिर यदि आवश्यक हो तो आप सत्र ऑथ का उपयोग जारी रख सकते हैं और अपने विचारों को मुक्त करने के लिए csrf को नहीं करना है।

1

आप जिस समस्या का सामना कर रहे हैं वह यह है कि आपके दृश्य को संसाधित करने के लिए django जो भी as_view() विधि का उपयोग कर रहा है, सीधे get() या post() विधि का उपयोग नहीं करेगा। यूआरएल में

  1. :

    इसलिए आप अपने वर्ग आधारित दृश्य को सजाने चाहिए निम्न तरीकों में से एक में।py

 
    urlpatterns = patterns('', 
     url('^login/$', csrf_exempt(views.LoginView.as_view())), 
     ... 
    ) 
  1. या dispatch() विधि (पूर्व Django 1.9) पर
 
    from django.utils.decorators import method_decorator 

    class LoginView(APIView): 
     @method_decorator(csrf_exempt) 
     def dispatch(self, *args, **kwargs): 
      ... 
  1. या वर्ग दृश्य पर खुद (Django 1.9 से)
 
    from django.utils.decorators import method_decorator 


    @method_decorator(csrf_exempt, name='dispatch') 
    class LoginView(APIView): 
      ... 
0

मुझे एक ही समस्या है। मेरी समस्या यह थी कि मैं MyAPIView पर urls.py में .as_view() को भूल गया।

url(r'$', GetLikesAPI.as_view(), name='list') 

नहीं:: तो यह की तरह होने की जरूरत है यह happend मेरे मामले में

url(r'$', GetLikesAPI, name='list') 
0

क्योंकि मैं अंत में स्लेश के बिना यूआरएल के लिए = 'http://example.com/list/5 के अनुरोध डाल भेजा। जब मैंने यूआरएल को यूआरएल = 'http://example.com/list/5/' में बदल दिया, तो सभी ने काम करना शुरू कर दिया।

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