2015-01-16 10 views
5

मैं Django में एक बहुत ही बुनियादी AJAX अनुरोध लिखने की कोशिश कर रहा हूं, और मुझे क्रोम देव और Django दोनों कंसोल में 403 वर्जित त्रुटि मिल रही है। मैंने दूसरे दिन एक समान प्रश्न पोस्ट किया है और @csrf_exempt सहित सभी प्रस्तावित समाधानों को आजमाया है (अगर यह एक सीएसआरएफ मुद्दा भी है तो बाहर निकलने के लिए), मैंने csrfmiddlewaretoken सहित कोशिश की है: '{{csrf_token}}' AJAX POST अनुरोध में (डेटा के नीचे), इसने इस मुद्दे को हल नहीं किया। मेरा कोड यहाँ है।AJAX अनुरोध में @csrf_exempt का उपयोग करते समय मुझे 403 निषिद्ध त्रुटि क्यों मिल रही है?

def profile_listview(request, username, 
    template_name=userena_settings.USERENA_PROFILE_DETAIL_TEMPLATE, 
    extra_context=None, **kwargs): 
    user = get_object_or_404(get_user_model(), 
          username__iexact=username) 
    fullsalelist = Entry.objects.filter(author__username__iexact=username) 

    @csrf_exempt 
    def delete_object(request): 
     if request.is_ajax(): 
      print "request is ajax" 
      object_name = request.POST.get('entryname') 
      targetobject = Entry.objects.get(headline=object_name) 
      if request.user.username == targetobject.author: 
       targetobject.delete() 
       print "hello" 
      return HttpResponseRedirect('/storefront/') 

और टेम्पलेट में AJAX कोड: ध्यान देने योग्य

<script type="text/javascript"> 
    var my_app = { 
     username: "{{ request.user.username }}" 
    }; 
</script> 

<script> 
$(document).ready(function() { 
    $(".delete_button").click(function() { 
     var id = $(this).attr('id'); 
     $.ajax({ 
      type: "POST", 
      url: "/accounts/" + my_app.username + "/listview/", 
      data: { entryname:id }, 
     }); 
     return false; 
    }); 
}); 
</script> 

यूआरएल

(r'^accounts/(?P<username>[\@\.\w-]+)/listview/$', profile_listview), 

चीजें:

  1. मैं CSRF है मिडलवेयर अपनी सेटिंग्स

    में चालू
  2. jQuery AJAX कोड, यूआरएल और डेटा के अंदर दोनों सही जानकारी

  3. जब मैं हटाएँ बटन पर क्लिक भेजने हैं, मैं 403 निषिद्ध त्रुटि मिलती है।

  4. प्रिंट "अनुरोध AJAX" कंसोल (या कहीं भी) में प्रिंट नहीं करता है।

मैं भी उलझन में हूं क्योंकि मुझे विवादित जानकारी मिल रही है। मुझे बताया गया था कि मुझे जावास्क्रिप्ट (https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/) के माध्यम से csrf मान जोड़ना चाहिए। यह मुझे 2 प्रश्नों के साथ छोड़ देता है। 1. csrfmiddlewaretoken जोड़ने से यह अलग कैसे है: '{{csrf_token}}' मेरे POST अनुरोध में? और 2. सबसे महत्वपूर्ण बात यह है कि @csrf_exempt प्रकार का उपयोग करते समय मुझे अभी भी 403 त्रुटि मिलती है, यह एक महत्वपूर्ण बिंदु बनाते हैं?

+0

लेकिन आप अपने अनुरोध में सीएसआरएफ टोकन नहीं भेज रहे हैं। –

+0

csrf_exempt सजावट को जोड़ना उस प्रतिबंध को हटा देना चाहिए, लेकिन यह अजीब बात है कि 403 वापस कर दिया जाएगा। – Brandon

+0

एक अलग नोट पर, आपका जावास्क्रिप्ट कोड सर्वर-साइड 'HttpResponseRedirect' को संसाधित करने में सक्षम नहीं होगा।आपको उस स्ट्रिंग के रूप में उसे वापस पास करने की आवश्यकता होगी और फिर: 'top.location = json.redirect_url' उदाहरण के लिए। – Brandon

उत्तर

0

में मदद करता है मेरी समझ के लिए, delete_object profile_listview अंदर एक समारोह है, लेकिन profile_listview यह फोन नहीं किया। इसलिए, प्रोफ़ाइल_सूचीदृश्य में कोई http प्रतिक्रिया नहीं है। त्रुटि संदेश पोस्ट करें

+0

दृश्य बनाने के इस तरह का वर्णन किया गया है, मैंने AJAX सामान फ़ॉर्म delete_object को प्रोफ़ाइल_सूचीदृश्य में ले जाया है। तो मैंने अभी delete_object फ़ंक्शन से छुटकारा पा लिया और इसे सभी को एक फ़ंक्शन में डाल दिया। – stephan

0

catavaran के रूप में लगता है कि आपने गलत दृश्य कहा है। आपको delete_object व्यू को कॉल करना चाहिए। उदाहरण के लिए, यूआरएल

(r'^accounts/(?P<username>[\@\.\w-]+)/listview/delete_object$', delete_object) 

और अजाक्स

$.ajax({ 
     type: "POST", 
     url: "/accounts/" + my_app.username + "/listview/delete_object", 
     data: { entryname:id }, 
    }); 

जोड़ने मुझे आशा है कि

+0

समझ में आता है, लेकिन delete_object वर्तमान में प्रोफ़ाइल_सूचीदृश्य विधि में है, तो इसे सही काम करना चाहिए? याँ नहीं। – stephan

+0

मुझे लगता है कि किसी तरह के सामान्य विचारों के साथ काम करना चाहिए। लेकिन यह एक उचित सामान्य दृश्य के रूप में नहीं दिखता है। मैं समझ नहीं पा रहा हूं कि आपका django delete_object फ़ंक्शन को कैसे संभालता है। यदि यह काम करना चाहिए तो क्या आप आलेख प्रदान कर सकते हैं जहां – dyus

1

@csrf_exempt को urls.py द्वारा बुलाए जाने वाले फ़ंक्शन से पहले होना आवश्यक है। ओपी के उदाहरण में, delete_object को कभी नहीं कहा गया था क्योंकि प्रोफ़ाइल_listview को कॉल करते समय त्रुटि पहले से ही हुई थी जिसमें सजावट नहीं थी।

एक तरफ ध्यान दें, यदि कोई URL मौजूद नहीं है, तो एक जैसी स्थिति हो सकती है (@csrf_exempt लेकिन 403 प्राप्त करना)। किसी कारण से (सुरक्षा?), यह 404 के बजाय 403 वापस कर देगा, इसलिए इसे डीबग करना मुश्किल हो सकता है।

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