Django CSRF एक अजाक्स POST अनुरोध के साथ विफल हो रहा है


180

मैं अपने AJAX पोस्ट के माध्यम से Django के CSRF सुरक्षा तंत्र के अनुपालन में कुछ मदद का उपयोग कर सकता हूं। मैंने यहां निर्देशों का पालन किया है:

http://docs.djangoproject.com/en/dev/ref/contrib/csrf/

मैंने AJAX नमूना कोड कॉपी किया है जो उनके पास उस पृष्ठ पर है:

http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

मैंने कॉल से getCookie('csrftoken')पहले सामग्री को प्रिंट करने के लिए एक अलर्ट डाला xhr.setRequestHeaderऔर यह वास्तव में कुछ डेटा के साथ आबाद है। मुझे यकीन नहीं है कि कैसे सत्यापित करें कि टोकन सही है, लेकिन मुझे प्रोत्साहित किया गया है कि यह कुछ ढूंढ रहा है और भेज रहा है।

लेकिन Django अभी भी मेरे AJAX पोस्ट को अस्वीकार कर रहा है।

यहाँ मेरा जावास्क्रिप्ट है:

$.post("/memorize/", data, function (result) {
    if (result != "failure") {
        get_random_card();
    }
    else {
        alert("Failed to save card data.");
    }
});

यहाँ त्रुटि मैं Django से देख रहा हूँ:

[२३ / फरवरी / २०११ २२-०२:२ ९] "पोस्ट / याद / HTTP / १.१" ४०३ २३३२

मुझे यकीन है कि मैं कुछ याद कर रहा हूं, और शायद यह सरल है, लेकिन मुझे नहीं पता कि यह क्या है। मैंने एसओ के आसपास खोज की है और csrf_exemptडेकोरेटर के माध्यम से मेरे विचार के लिए सीएसआरएफ चेक को बंद करने के बारे में कुछ जानकारी देखी है , लेकिन मुझे लगता है कि यह अनुपलब्ध है। मैंने कोशिश की है कि यह काम करे, लेकिन मैं अपने POST को उस तरह से काम करने के लिए लूँगा, जिस तरह से संभव हो तो Django को इसकी उम्मीद थी।

बस अगर यह मददगार हो, तो यहाँ मेरा नज़रिया देख रहा है:

def myview(request):

    profile = request.user.profile

    if request.method == 'POST':
        """
        Process the post...
        """
        return HttpResponseRedirect('/memorize/')
    else: # request.method == 'GET'

        ajax = request.GET.has_key('ajax')

        """
        Some irrelevent code...
        """

        if ajax:
            response = HttpResponse()
            profile.get_stack_json(response)
            return response
        else:
            """
            Get data to send along with the content of the page.
            """

        return render_to_response('memorize/memorize.html',
                """ My data """
                context_instance=RequestContext(request))

आपके उत्तर के लिए धन्यवाद!


1
आप किस संस्करण का उपयोग कर रहे हैं?
zsquare

क्या आपने सही CSRF मिडलवेयर कक्षाओं में जोड़ा है और उन्हें सही क्रम में रखा है?
डैरेन

जैकब ने मेरे सवाल का जवाब दिया, लेकिन सिर्फ दूसरे लोगों के लिए यह उपयोगी है: @zsquare: संस्करण 1.2.3। @mongoose_za: हां, वे जोड़े गए हैं और सही क्रम में हैं।
फायरबश

जवाबों:


181

वास्तविक समाधान

ठीक है, मैं नीचे समस्या का पता लगाने में कामयाब रहा। यह जावास्क्रिप्ट में निहित है (जैसा कि मैंने नीचे सुझाव दिया है) कोड।

आपको इसकी क्या आवश्यकता है:

$.ajaxSetup({ 
     beforeSend: function(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'));
         }
     } 
});

आधिकारिक डॉक्स में पोस्ट किए गए कोड के बजाय: https://docs.djangoproject.com/en/2.2/ref/csr//

वर्किंग कोड, इस Django प्रविष्टि से आता है: http://www.djangoproject.com/weblog/2011/feb/08/security/

तो सामान्य समाधान है: "ajaxSetup हैंडलर के बजाय ajaxSend हैंडलर का उपयोग करें"। मुझे नहीं पता कि यह क्यों काम करता है। लेकिन यह मेरे लिए काम कर गया :)

पिछला पोस्ट (बिना उत्तर के)

मैं वास्तव में एक ही समस्या का सामना कर रहा हूँ।

यह Django 1.2.5 में अपडेट होने के बाद होता है - Django 1.2.4 में AJAX POST अनुरोधों के साथ कोई त्रुटि नहीं थी (AJAX किसी भी तरह से सुरक्षित नहीं था, लेकिन यह ठीक काम किया)।

ओपी की तरह, मैंने Django प्रलेखन में तैनात जावास्क्रिप्ट स्निपेट की कोशिश की है। मैं jQuery 1.5 का उपयोग कर रहा हूं। मैं "django.middleware.csrf.CsrfViewMiddleware" मिडलवेयर का भी उपयोग कर रहा हूं।

मैंने मिडलवेयर कोड का पालन करने की कोशिश की और मुझे पता है कि यह इस पर विफल है:

request_csrf_token = request.META.get('HTTP_X_CSRFTOKEN', '')

और फिर

if request_csrf_token != csrf_token:
    return self._reject(request, REASON_BAD_TOKEN)

यह "यदि" सत्य है, क्योंकि "request_csrf_token" खाली है।

मूल रूप से इसका मतलब है कि हेडर सेट नहीं है। तो क्या इस JS लाइन में कुछ गड़बड़ है:

xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));

?

मुझे आशा है कि प्रदान किए गए विवरण हमें समस्या को हल करने में मदद करेंगे :)


यह काम किया! मैं .ajaxSetup फ़ंक्शन में डाल देता हूं क्योंकि आपने इसे ऊपर चिपकाया था और अब मैं 403 त्रुटि के बिना पोस्ट करने में सक्षम हूं। समाधान साझा करने के लिए धन्यवाद, जैकब। अच्छा मिल गया। :)
फायरबश

JQuery के डॉक्स पर काउंटर रन के ajaxSetupबजाय का उपयोग करना ajaxSend: api.jquery.com/jQuery.ajaxSetup
Mark Lavin

1.3 का उपयोग करते हुए, आधिकारिक django प्रलेखन प्रविष्टि ने मेरे लिए काम किया।
मॉर्कुट

1
मैंने कोशिश की, लेकिन यह मेरे लिए काम नहीं करता है, मैं jQuery v1.7.2 का उपयोग कर रहा हूं, मेरा सवाल है stackoverflow.com/questions/11812694/…
daydreamer

मुझे अपने व्यू फंक्शन में एनोटेशन @ensure_csrf_cookie को जोड़ना होगा ताकि मोबाइल डिवाइस से पेज रिक्वेस्ट करने पर csrf कुकी को सेट किया जा सके।
केन

169

यदि आप $.ajaxफ़ंक्शन का उपयोग करते हैं, तो आप बस csrfडेटा बॉडी में टोकन जोड़ सकते हैं :

$.ajax({
    data: {
        somedata: 'somedata',
        moredata: 'moredata',
        csrfmiddlewaretoken: '{{ csrf_token }}'
    },

2
जब मैं चिह्नित जवाब का उपयोग करता हूं तो यह मेरे लिए काम करता है, लेकिन अगर मैं यहां आपके समाधान का उपयोग करता हूं तो यह नहीं होता है। लेकिन आपका समाधान हालांकि काम करना चाहिए, मुझे समझ नहीं आता कि यह क्यों नहीं है। क्या कुछ और है जो कि Django 1.4 में किया जाना चाहिए?
होउमन

1
धन्यवाद! बहुत आसन। अभी भी django 1.8 और jquery पर काम करता है 2.1.3
अलेजांद्रो वींटिमिला

19
इस समाधान के लिए जावास्क्रिप्ट को टेम्प्लेट में सम्‍मिलित करना आवश्यक है?
मोक्स

15
@ मॉक्स: इसे html में रखें, लेकिन अपने जेएस फ़ाइल के ऊपर जहां एक अजाक्स फ़ंक्शन है <script type="text/javascript"> window.CSRF_TOKEN = "{{ csrf_token }}"; </script>
HereHere

धन्यवाद! इतना सरल और सुरुचिपूर्ण। यह मेरे लिए Django 1.8 के साथ काम करता है। मैंने एक कॉल में csrfmiddlewaretoken: '{{ csrf_token }}'अपना dataशब्दकोश जोड़ा $.post
पावेल युदेव

75

इस लाइन को अपने jQuery कोड में जोड़ें:

$.ajaxSetup({
  data: {csrfmiddlewaretoken: '{{ csrf_token }}' },
});

और हो गया।


मैंने यह कोशिश की, सिवाय इसके कि मेरे फॉर्म में फ़ाइल अपलोड है। मेरा बैकएंड django है और अभी भी त्रुटि 400CSRF Failed: CSRF token missing or incorrect.
हुसैन

16

मुद्दा यह है क्योंकि django कुकी से मान को फॉर्म डेटा के हिस्से के रूप में वापस पारित होने की उम्मीद कर रहा है। पिछले उत्तर के कोड से कुकी मूल्य का शिकार करने के लिए जावास्क्रिप्ट हो रही है और इसे फॉर्म डेटा में डाल दिया गया है। यह एक तकनीकी दृष्टिकोण से करने का एक प्यारा तरीका है, लेकिन यह थोड़ा वर्बोज़ दिखता है।

अतीत में, मैंने पोस्ट डेटा में टोकन मूल्य डालने के लिए जावास्क्रिप्ट प्राप्त करके इसे और अधिक सरलता से किया है।

यदि आप अपने टेम्पलेट में {% csrf_token%} का उपयोग करते हैं, तो आपको एक छिपा हुआ फॉर्म फ़ील्ड मिलेगा, जो मूल्य वहन करता है। लेकिन, यदि आप {{csrf_token}} का उपयोग करते हैं, तो आपको टोकन का नंगे मूल्य मिलेगा, इसलिए आप इसे इस तरह से जावास्क्रिप्ट में उपयोग कर सकते हैं ...।

csrf_token = "{{ csrf_token }}";

फिर आप इसे शामिल कर सकते हैं, हैश में आवश्यक नाम के साथ फिर आप डेटा को अजाक्स कॉल में सबमिट करें।


@aehlke आपके पास स्थिर फाइलें हो सकती हैं। स्रोत कोड में, आप एक अच्छा उदाहरण देख सकते हैं, जहां आप ऑब्जेक्ट में django चर पंजीकृतwindow करते हैं, इसलिए वे बाद में पहुंच योग्य हैं। स्टैटिक फाइलों में भी।
किटकैट

3
@KitKat वास्तव में :) मेरी प्राचीन, अज्ञानी टिप्पणी के लिए क्षमा करें। अच्छी बात।
ऐहलके

स्थिर फ़ाइलें। एक मुद्दा नहीं है, अगर आप अपने HTML का एक छोटा सा हिस्सा बुरा नहीं मानते हैं। मैंने मुख्य HTML टेम्प्लेट में {{csrf_token}} डाला है, न कि अपेक्षित आवृत्तियों से। एक जादू की तरह काम किया।
JL Peyret

14

{% csrf_token %}Html में डाल अंदर टेम्पलेट्स<form></form>

कुछ इस तरह का अनुवाद:

<input type='hidden' name='csrfmiddlewaretoken' value='Sdgrw2HfynbFgPcZ5sjaoAI5zsMZ4wZR' />

तो क्यों नहीं इसे अपने जेएस में इस तरह से तैयार करें:

token = $("#change_password-form").find('input[name=csrfmiddlewaretoken]').val()

और फिर इसे पास करें जैसे कुछ POST कर रहे हैं, जैसे:

$.post( "/panel/change_password/", {foo: bar, csrfmiddlewaretoken: token}, function(data){
    console.log(data);
});

9

गैर- jquery उत्तर:

var csrfcookie = function() {
    var cookieValue = null,
        name = 'csrftoken';
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = cookies[i].trim();
            if (cookie.substring(0, name.length + 1) == (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
};

उपयोग:

var request = new XMLHttpRequest();
request.open('POST', url, true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
request.setRequestHeader('X-CSRFToken', csrfcookie());
request.onload = callback;
request.send(data);

8

यदि आपका फॉर्म जेएस के बिना Django में सही तरीके से पोस्ट करता है, तो आपको बिना किसी हैकिंग या गन्दा पास के csrf टोकन के बिना उत्तरोत्तर इसे बढ़ाने में सक्षम होना चाहिए। बस पूरे फॉर्म को क्रमबद्ध करें और वह स्वचालित रूप से आपके सभी फॉर्म फ़ील्ड को छिपाएगा जिसमें छिपा हुआ सीएसआरएफ फ़ील्ड भी शामिल है:

$('#myForm').submit(function(){
    var action = $(this).attr('action');
    var that = $(this);
    $.ajax({
        url: action,
        type: 'POST',
        data: that.serialize()
        ,success: function(data){
            console.log('Success!');
        }
    });
    return false;
});

मैंने इसे Django 1.3+ और jQuery 1.5+ के साथ परीक्षण किया है। जाहिर है कि यह किसी भी HTML फॉर्म के लिए काम करेगा, न कि सिर्फ Django ऐप के लिए।


5

फायरबग के साथ फ़ायरफ़ॉक्स का उपयोग करें। अजाक्स अनुरोध फायरिंग करते समय 'कंसोल' टैब खोलें। साथ DEBUG=Trueआपको मिल प्रतिक्रिया के रूप में त्रुटि पृष्ठ Django अच्छा और तुम भी सांत्वना टैब में ajax प्रतिक्रिया के प्रदान की गई एचटीएमएल देख सकते हैं।

फिर आपको पता चल जाएगा कि त्रुटि क्या है।


5

स्वीकृत उत्तर सबसे अधिक संभावना एक लाल हेरिंग है। Django 1.2.4 और 1.2.5 के बीच अंतर AJAX अनुरोधों के लिए CSRF टोकन की आवश्यकता थी।

मुझे Django 1.3 पर यह समस्या आई और यह CSRF कुकी के सेट नहीं होने के कारण हुआ पहले स्थान पर जाने के कारण हुआ। Django कुकी को तब तक सेट नहीं करेगा जब तक कि उसे करना न पड़े। तो Django 1.2.4 पर चलने वाला एक विशेष या भारी अजाक्स साइट संभावित रूप से कभी भी ग्राहक को टोकन नहीं भेजती है और फिर टोकन की आवश्यकता वाले अपग्रेड को 403 त्रुटियों का कारण होगा।

आदर्श निर्धारण यहां है: http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#page-uses-ajax-without-any-html-form,
लेकिन आपको 1.4 तक इंतजार करना होगा यह सिर्फ कोड के साथ दस्तावेज पकड़ रहा है

संपादित करें

यह भी ध्यान दें कि बाद में Django डॉक्स jQuery 1.5 में एक बग को नोट करता है, इसलिए सुनिश्चित करें कि आप 1.5.1 या बाद में Django द्वारा सुझाए गए कोड का उपयोग कर रहे हैं: http://docs.djangoproject.com/en/1.3/ref/contrib/csrf/# ajax


इसे लिखने के समय मेरा जवाब सटीक था :) यह सिर्फ Django के 1.2.4 से 1.2.5 तक अपडेट होने के बाद था। यह तब भी था जब नवीनतम jQuery संस्करण 1.5 था। यह पता चला है कि समस्या का स्रोत jQuery (1.5) को बंद कर दिया गया था और यह जानकारी अब Django के दस्तावेज़ में जोड़ दी गई है, जैसा कि आपने बताया है। मेरे मामले में: कुकी WAS सेट और टोकन AJAX अनुरोध में जोड़ा नहीं गया था। दिया गया फिक्सिंग jQuery 1.5 के लिए ठीक किया गया। अब तक, आप केवल आधिकारिक डॉक्स से चिपके रह सकते हैं, वहां दिए गए उदाहरण कोड और नवीनतम jQuery का उपयोग करके। आपकी समस्या के बारे में यहां चर्चा की गई समस्याओं से अलग स्रोत था :)
जकुब गोक्लाव्स्की

2
अब एक डेकोरेटर कहा जाता है ensure_csrf_cookieजिसे आप कुकी को भेजने के लिए एक दृश्य के चारों ओर लपेट सकते हैं।
ब्रायन नील

यह वह मुद्दा है जो मैं कर रहा था, csrftokenपहली जगह में कोई कुकी नहीं है, धन्यवाद!
crhodes

5

ऐसा लगता है कि किसी ने उल्लेख नहीं किया है कि X-CSRFTokenहेडर का उपयोग करके शुद्ध जेएस में यह कैसे करना है {{ csrf_token }}, इसलिए यहां एक सरल समाधान है जहां आपको कुकीज़ या डोम के माध्यम से खोज करने की आवश्यकता नहीं है:

var xhttp = new XMLHttpRequest();
xhttp.open("POST", url, true);
xhttp.setRequestHeader("X-CSRFToken", "{{ csrf_token }}");
xhttp.send();

4

जैसा कि यह वर्तमान उत्तरों में कहीं भी नहीं बताया गया है, यदि आप एम्बेड नहीं कर रहे हैं तो सबसे तेज़ समाधान है अपने टेम्पलेट में js है:

<script type="text/javascript"> window.CSRF_TOKEN = "{{ csrf_token }}"; </script>अपने टेम्प्लेट में script.js फ़ाइल के संदर्भ से पहले रखें , फिर csrfmiddlewaretokenअपने dataशब्दकोश में अपनी js फ़ाइल में जोड़ें :

$.ajax({
            type: 'POST',
            url: somepathname + "do_it/",
            data: {csrfmiddlewaretoken: window.CSRF_TOKEN},
            success: function() {
                console.log("Success!");
            }
        })

2

मैंने अभी कुछ अलग लेकिन इसी तरह की स्थिति का सामना किया है। 100% निश्चित नहीं है कि यह आपके मामले का समाधान होगा, लेकिन मैंने Django 1.3 के लिए POST पैरामीटर 'csrfmiddlewaretoken' को उचित कुकी मान स्ट्रिंग के साथ सेट करके समस्या का समाधान किया है जो आमतौर पर Django के द्वारा आपके घर HTML के रूप में वापस किया जाता है टेम्पलेट सिस्टम '{% csrf_token%}' टैग के साथ। मैंने पुराने Django पर कोशिश नहीं की, बस हुआ और Django1.3 पर हल हुआ। मेरी समस्या यह थी कि एक फॉर्म से अजाक्स के माध्यम से प्रस्तुत किया गया पहला अनुरोध सफलतापूर्वक किया गया था, लेकिन ठीक उसी से दूसरा प्रयास विफल हो गया, जिसके परिणामस्वरूप 403 राज्य थे, हालांकि हेडर 'X-CSRFToken' को सही ढंग से CSRF टोकन के साथ रखा गया था पहले प्रयास के मामले में के रूप में। उम्मीद है की यह मदद करेगा।

सादर,

हीरो


2

आप इस js को अपने html फ़ाइल में पेस्ट कर सकते हैं, याद रखें इसे अन्य js फ़ंक्शन से पहले रखें

<script>
  // using jQuery
  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;
  }

  function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
  }

  $(document).ready(function() {
    var csrftoken = getCookie('csrftoken');
    $.ajaxSetup({
      beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
          xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
      }
    });
  });
</script>


1

एक CSRF टोकन हर सत्र (यानी हर बार जब आप लॉग इन करते हैं) को सौंपा जाता है। तो इससे पहले कि आप उपयोगकर्ता द्वारा दर्ज किए गए कुछ डेटा को प्राप्त करना चाहते हैं और भेजें कि कुछ फ़ंक्शन के लिए ajax कॉल के रूप में जिसे csrf_protect डेकोरेटर द्वारा संरक्षित किया गया है, उन कार्यों को खोजने का प्रयास करें जिन्हें आप उपयोगकर्ता से यह डेटा प्राप्त कर रहे हैं। उदाहरण के लिए कुछ टेम्प्लेट दिए जाने चाहिए, जिस पर आपका उपयोगकर्ता डेटा दर्ज कर रहा है। उस टेम्पलेट को किसी फ़ंक्शन द्वारा प्रदान किया जा रहा है। इस फ़ंक्शन में आप निम्न प्रकार से csrf टोकन प्राप्त कर सकते हैं: csrf = request.COOKIES ['csrftoken'] अब इस csrf मान को संदर्भ शब्दकोश में पास करें, जिसमें विचाराधीन टेम्पलेट का प्रतिपादन किया जा रहा है। अब उस टेम्पलेट में इस लाइन को लिखें: अब आपके जावास्क्रिप्ट फ़ंक्शन में, अजाक्स अनुरोध करने से पहले, इसे लिखें: var csrf = $ ('# csrf')। वैल () यह टोकन के मूल्य को टेम्पलेट में ले जाएगा और इसे चर सीएसआरएफ में संग्रहीत करेगा। अब अपने पोस्ट डेटा में अजाक्स कॉल करते समय, इस मान को भी पास करें: "csrfmiddlewaretoken": csrf

यह तब भी काम करेगा जब आप django रूपों को लागू नहीं कर रहे हैं।

वास्तव में, यहाँ तर्क है: आपको टोकन की आवश्यकता है जिसे आप अनुरोध से प्राप्त कर सकते हैं। तो आपको बस लॉग इन करने के तुरंत बाद फंक्शन को कॉल करने की आवश्यकता है। एक बार जब आपके पास यह टोकन होता है, तो इसे प्राप्त करने के लिए एक और अजाक्स कॉल करें या इसे किसी टेम्पलेट में पास करें जो आपके अजाक्स द्वारा सुलभ हो।


बहुत अच्छी तरह से संरचित नहीं है, लेकिन अच्छी तरह से समझाया गया है। मेरा मुद्दा था, मैं सीएसआरएफ को इस तरीके से भेज रहा था: csrftoken: csrftokenबजाय इसके csrfmiddlwaretoken: csrftoken। बदलाव के बाद इसने काम किया। धन्यवाद
लगभग एक शुरुआत

1

किसी व्यक्ति के लिए जो इस पार आता है और डिबग करने की कोशिश कर रहा है:

1) django csrf चेक (यह मानते हुए कि आप एक भेज रहे हैं) यहाँ है

2) मेरे मामले में, settings.CSRF_HEADER_NAME'HTTP_X_CSRFTOKEN' पर सेट किया गया था और मेरा AJAX कॉल 'HTTP_X_CSRF_TOKEN' नाम का हेडर भेज रहा था, इसलिए सामान काम नहीं कर रहा था। मैं या तो AJAX कॉल, या django सेटिंग में इसे बदल सकता था।

3) यदि आप इसे सर्वर-साइड बदलने का विकल्प चुनते हैं, तो django के अपने इंस्टॉल स्थान को ढूंढें और csrf middlewareयदि आप उपयोग कर रहे हैं virtualenv, तो एक ब्रेकपॉइंट फेंकें , यह कुछ इस तरह होगा:~/.envs/my-project/lib/python2.7/site-packages/django/middleware/csrf.py

import ipdb; ipdb.set_trace() # breakpoint!!
if request_csrf_token == "":
    # Fall back to X-CSRFToken, to make things easier for AJAX,
    # and possible for PUT/DELETE.
    request_csrf_token = request.META.get(settings.CSRF_HEADER_NAME, '')

फिर, सुनिश्चित करें कि csrfटोकन अनुरोध से सही ढंग से सॉर्ट किया गया है। मीटा

4) यदि आपको अपने हेडर आदि को बदलने की आवश्यकता है, तो - उस चर को अपनी सेटिंग फ़ाइल में बदलें



0

मेरे मामले में समस्या nginx config के साथ थी जिसे मैंने मुख्य सर्वर से अस्थायी रूप से कॉपी किया है जो कि अक्षम https के साथ है जिसे इस प्रक्रिया में दूसरे एक की आवश्यकता नहीं है।

मुझे इसे फिर से काम करने के लिए विन्यास में इन दो पंक्तियों पर टिप्पणी करनी थी:

# uwsgi_param             UWSGI_SCHEME    https;
# uwsgi_pass_header       X_FORWARDED_PROTO;

0

यहाँ Django द्वारा प्रदान किया गया एक कम क्रिया समाधान है:

<script type="text/javascript">
// using jQuery
var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
// set csrf header
$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

// Ajax call here
$.ajax({
    url:"{% url 'members:saveAccount' %}",
    data: fd,
    processData: false,
    contentType: false,
    type: 'POST',
    success: function(data) {
        alert(data);
        }
    });
</script>

स्रोत: https://docs.djangoproject.com/en/1.11/ref/csrf/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.