2011-05-31 19 views
6

django 1.3 में अब आपको AJAX के साथ csrf का उपयोग करना होगा। मैं jquery का उपयोग करता हूं और अब मैं csrf टोकन $ .post में जोड़ना चाहता हूं। मैं यह कैसे कर सकता हूँ? मैं jquery में बहुत कुशल नहीं हूँ इसलिए यह एक अच्छा वर्णन के साथ अच्छा होगा।

यह एक रेटिंग ऐप है और जब कोई स्टार क्लिक किया जाता है तो पोस्ट भेजता है। मैंने django docs देखा है लेकिन मुझे नहीं पता कि मेरी स्थिति में क्या करना है। मेरा कोड नीचे है:

$(function() { 
      $("#avg").children().not(":input").hide(); 
      $("#rating-widget").children().not("select").hide();  

      $caption = $("<span/>"); 

      $("#avg").stars({captionEl: $caption}); 
      $("#rating-widget").stars({ 
       inputType: "select", 
       cancelShow: false, 
       captionEl: $caption, 
       callback: function(ui, type, value){ 
-------------->  $.post($("#rating-widget").attr("action"), {score: value}, function(data){ 

        }); 
       } 
      }); 
       $caption.appendTo("#rating-widget"); 

}); 

यह कहा जाना चाहिए कि जावास्क्रिप्ट एक टेम्पलेट में नहीं बल्कि स्थिर फ़ाइल में है। क्या इसे टेम्पलेट में रखना सबसे अच्छा होगा, इसलिए मैं {{ csrf_token }}

का उपयोग कर सकता हूं अग्रिम धन्यवाद!

उत्तर

7

अपने फ़ंक्शन से पहले इस कोड को रखें। यह सीएसआरएफ का ख्याल रखेगा।

$('html').ajaxSend(function(event, xhr, settings) { 
    function getCookie(name) { 
     var cookieValue = null; 
     if (document.cookie && document.cookie != '') { 
      var cookies = document.cookie.split(';'); 
      for (var i = 0; i < cookies.length; i++) { 
       var cookie = jQuery.trim(cookies[i]); 
       // Does this cookie string begin with the name we want? 
       if (cookie.substring(0, name.length + 1) == (name + '=')) { 
        cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
        break; 
       } 
      } 
     } 
     return cookieValue; 
    } 
    if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { 
     // Only send the token to relative URLs i.e. locally. 
     xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); 
    } 
}); 
+1

मुझे अभी एक [संपादित संस्करण] मिला है (http://stackoverflow.com/questions/5100539/django -csrf-check-failing-a-ajax-post-request) के बजाय वे AJAXSetup का उपयोग करते थे। यह मेरे लिए काम करता है :) नहीं पता था कि यह इतना आसान था! धन्यवाद! – tmpethick

3

django documentation में आप प्रत्येक AJAX अनुरोध में सीएसआरएफ टोकन को स्वचालित रूप से कैसे शामिल करने के बारे में एक सरल विवरण प्राप्त कर सकते हैं!

+0

जैसा कि सवाल में कहा गया है: मैंने पहले ही उस जगह को चेक किया है, लेकिन इसे समझ नहीं पाया और इसे मेरे कोड में फिट कर सकता था। लेकिन मदद करने के प्रयास के लिए किसी भी तरह धन्यवाद :) – tmpethick

+0

जब तक मैंने AJAXSetup में दिए गए बयानों को हटा नहीं दिया, तब तक मेरे लिए काम नहीं किया, और केवल xhr.setRequestHeader ("X-CSRFToken", csrftoken) था; – bozdoz

1

आपको एक फॉर्म का उपयोग करने की ज़रूरत नहीं है! बस एक नया यूआरएल बनाएं जो कि "सितारों" पदों के फ़ंक्शन से जुड़ा हुआ हो। उदाहरण

(r'^myapp/star-post/(?P<post_id>.*)/$','myapp.views.myview') 

इसलिए के लिए, यदि आपको लगता है कि यूआरएल के लिए एक अनुरोध भेजने के लिए, यह अपने डेटाबेस में पोस्ट, खोजने के क्षेत्र "में अभिनय किया" को बदल सकते हैं और ajax के लिए एक प्रतिक्रिया वापस आ जाएगी।

फिर आप सफलता पर कॉलबैक फ़ंक्शन कर सकते हैं जो तदनुसार सीएसएस को बदल देगा (स्टार, या आदि भरें)। इस तरह, आपको सीएसआरएफ के बारे में चिंता करने की ज़रूरत नहीं है।

लेकिन आप पूछ सकते हैं, क्रॉस-साइट-स्क्रिप्टिंग हमलों के बारे में क्या! खैर, यदि आप कुकी सत्यापन के साथ उपयोगकर्ता प्रमाणीकरण का उपयोग कर रहे हैं, तो आपको इसके बारे में चिंता करने की ज़रूरत नहीं है! आआंद आप जाने के लिए अच्छे हैं।

+0

यह वही है जो मैंने किया है। समस्या यह है कि मुझे इसे डेटाबेस में संग्रहीत करना है और यह मुझे एक सीएसआरएफ टोकन के लिए संकेत देता है .. समस्या के बाद मैं 1.2 से 1.3 अपडेट किया गया जहां आपने सीएसआरएफ टोकन का उपयोग किया है - यहां तक ​​कि AJAX के साथ भी। मैं जानना चाहता हूं कि अनुरोध में csrf टोकन को कैसे शामिल किया जाए AJAX – tmpethick

+0

@tmpethick के साथ भेजें csrf_exempt सजावट के साथ भी? django.views.decorators.csrf आयात से csrf_exempt – systemizer

+0

ने इसका उपयोग करने की कोशिश नहीं की है - लेकिन अब यह काम करता है :) – tmpethick

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