2012-07-07 6 views
22

मैं Django में एक साइट लिखने की कोशिश कर रहा हूं जहां एपीआई यूआरएल उपयोगकर्ता के सामने वाले यूआरएल के समान हैं। लेकिन मुझे उन पृष्ठों के साथ परेशानी हो रही है जो POST अनुरोध और सीएसआरएफ सुरक्षा का उपयोग करते हैं। उदाहरण के लिए, अगर मैं एक पृष्ठ/foo है/जोड़ने मैं दो तरीकों से इसे करने के लिए पोस्ट अनुरोध भेजने के लिए सक्षम होना चाहते हैं:मैं कुछ मामलों में केवल Django की सीएसआरएफ सुरक्षा को कैसे अक्षम कर सकता हूं?

  1. एक अंत उपयोगकर्ता (एक सत्र कुकी का उपयोग कर प्रमाणीकृत) एक पर्चे को जमा करने के रूप में। इसके लिए सीएसआरएफ सुरक्षा की आवश्यकता है।
  2. एक एपीआई क्लाइंट के रूप में (HTTP अनुरोध शीर्षलेख का उपयोग करके प्रमाणित)। सीएसआरएफ सुरक्षा सक्षम होने पर यह असफल हो जाएगा।

मुझे सीएसआरएफ को अक्षम करने के विभिन्न तरीकों को मिला है, जैसे कि @csrf_exempt, लेकिन ये सभी इसे संपूर्ण दृश्य के लिए अक्षम करते हैं। क्या इसे अधिक सुगंधित स्तर पर सक्षम/अक्षम करने का कोई तरीका है? या क्या मुझे सिर्फ सीएसआरएफ सुरक्षा से खरोंच से लागू करना होगा?

+1

क्या आपने [csrf सुरक्षा दस्तावेज़] (https://docs.djangoproject.com/en/dev/ref/contrib/csrf/) जांच लिया था? – machaku

+0

मैं इसके बिट्स पढ़ता था, लेकिन स्पष्ट रूप से सभी परिदृश्यों को नहीं पढ़ा था। धन्यवाद! – lucas

उत्तर

22

डीजेगो के सीएसआरएफ संरक्षण दस्तावेज का एक वर्ग View needs protection for one path शीर्षक है जो समाधान का वर्णन करता है। विचार पूरे दृश्य पर @csrf_exempt का उपयोग करना है, लेकिन जब API क्लाइंट हेडर मौजूद या अमान्य नहीं है, तो @csrf_protect के साथ एनोटेटेड फ़ंक्शन पर कॉल करें।

30

संशोधित urls.py

आप urls.py में अपने मार्गों का प्रबंधन करते हैं, तो आप उन्हें CSRF सत्यापन मिडलवेयर से बाहर करने के csrf_exempt() साथ अपने वांछित मार्गों लपेट कर सकते हैं।

उदाहरण के लिए ,

from django.views.decorators.csrf import csrf_exempt 
urlpatterns = patterns(
    # ... 
    # Will exclude `/api/v1/test` from CSRF 
    url(r'^api/v1/test', csrf_exempt(TestApiHandler.as_view())) 
    # ... 
) 

वैकल्पिक रूप से, एक डेकोरेटर

कुछ उनकी जरूरतों

उदाहरण के लिए के लिए अधिक उपयुक्त @csrf_exempt डेकोरेटर के उपयोग मिल सकता है के रूप में,

from django.views.decorators.csrf import csrf_exempt 
from django.http import HttpResponse 

@csrf_exempt 
def my_view(request): 
    return HttpResponse('Hello world')