2012-10-05 22 views
5
$.ajax({ 
    url:'/', 
    type: "POST", 
    data: {name: 'name', age: 'age'}, 
    success:function(response){}, 
    complete:function(){}, 
    error:function (xhr, textStatus, thrownError){} 
}); 

और views.py में:Django jQuery पोस्ट अनुरोध

class SomeView(generic_views.TemplateView): 
    template_name = 'something.html' 

    def get(self, request, *args, **kwargs): 
     ...something... 
     return self.render_to_response(context) 

    def post(self, request, *args, **kwargs): 
     name = request.POST['name'] 
     age = request.POST['age'] 
     ...something... 

और मैं मिलता है: [05/अक्टूबर/2012 00:03:58] "पोस्ट/कुछ/HTTP/1.1" 403 22 9 4

मैं "कुछ दृश्य" में इस पोस्ट फ़ंक्शन में jQuery के माध्यम से यह डेटा (नाम और आयु) भेजना चाहता हूं। यह लोड टेम्पलेट के समान दृश्य है, केवल अनुरोध प्रकार अलग है। टेम्पलेट लोड और पोस्ट पर() प्राप्त करें, पोस्ट() फ़ंक्शन को कॉल किया जाना चाहिए। क्या यह संभव है? मैंने अन्य प्रश्नों की जांच की है और यह समाधान मिला है। यह काम करना चाहिए था। मैं क्या गलत कर रहा हूं?

उत्तर

8

अपने प्रश्न का उत्तर आप गलत क्या कर रहे हैं, है : बहुत ज्यादा नहीं!

यदि कोई आने वाला POST अनुरोध सीएसआरएफ चेक विफल करता है तो Django 403 प्रतिक्रिया (निषिद्ध) देता है। आप jQuery के ajaxSetup के माध्यम से ऐसा कर सकते हैं, कोड के टुकड़े here

कारण यह है कि इस GET अनुरोध पर काम करता है पाए जाते हैं, बस उस प्राप्त अनुरोधों CSRF मिडलवेयर द्वारा जाँच नहीं कर रहे हैं।

जैसा कि ऐसा लगता है कि आप यहां एक फॉर्म बना रहे हैं, विचार करने के लिए एक और बात वर्ग आधारित रूपों का उपयोग कर रही है। वे आपके लिए get/post और पैरामीटर सत्यापन भी संभालते हैं। बहुत साफ़। विशेष रूप से जब आप मॉडल उदाहरणों को संपादित/बनाने/हटाने के लिए फॉर्म बना रहे हैं, तो इस मामले में आप ModelForms और CreateViews की शक्ति को गले लगा सकते हैं। बहुत साफ़।

उन सामान्य वर्ग आधारित विचारों को लटका पाने में कुछ समय लग सकता है। लेकिन यह बहुत लायक है।

+0

हाँ अन्य साइटों मैं FormView उपयोग कर रहा हूँ पर। लेकिन इस मामले में मैं (लंबी कहानी) नहीं कर सकता। :) अब बात काम करती है, लेकिन टर्मिनल में मैं देखता हूं [05/अक्टूबर/2012 15:08:11] "पोस्ट/कुछ/HTTP/1.1" 500 9 4 9 0 – premik91

+0

500 बस एक सर्वर त्रुटि है। यह आपकी पोस्ट विधि में किसी भी पायथन त्रुटि के कारण हो सकता है। –

+0

लेकिन यह दिखाना चाहिए क्योंकि मैं डीबग मोड में हूं, है ना? – premik91

6

आपको अपने AJAX कॉल में एक CSRF (क्रॉस-साइट अनुरोध फर्जी) टोकन शामिल करने की आवश्यकता है। यह अच्छी तरह से यहाँ प्रलेखित है: https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

या, आप एक त्वरित फिक्स उपयोग करना चाहते हैं, अपने दृश्य के लिए @csrf_exempt डेकोरेटर का उपयोग करें:

from django.views.decorators.csrf import csrf_exempt 

@csrf_exempt 
def my_view(request): 
    ... 
+0

आप आदमी धन्यवाद :) – premik91

2

आप इस जोड़ सकते हैं एक Django टेम्पलेट के भीतर ...

{% csrf_token %} 

कौन सा अपने पृष्ठ एचटीएमएल करने के लिए इस तरह उत्पादन कुछ होगा ...

<input type="hidden" name="csrfmiddlewaretoken" value="ckhUdNOTj88A...hfTnREALlks2kz"> 

तो फिर तुम बस इस पा सकते हैं जावास्क्रिप्ट का उपयोग करते हुए इनपुट करें और इसका मूल्य प्राप्त करें - इस गैर jQuery उदाहरण की तरह कुछ ...

var el = document.getElementsByName("csrfmiddlewaretoken"); 
csrf_value = el[0].getAttribute("value"); 

अंत में सी जोड़ें इसलिए की तरह अपने jQuery AJAX के पद प्रपत्र डेटा लाइन के लिए srf_value ...

data: {name: 'name', age: 'age', csrfmiddlewaretoken: csrf_value}, 

यहाँ एक काम कर jsFiddle अवधारणा है: https://jsfiddle.net/vdx1Lfpc/18/

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