2010-09-11 18 views
5

का उपयोग करते समय दो बार बुलाया जाता है I Google App Engine, Jquery और Django का उपयोग कर रहा हूं। मैं चाहता हूँ पोस्ट डेटा सर्वर साइड जब एक फार्म प्रस्तुत की है के लिए भेजा जाना है, और मैं निम्न कोड के साथ JQuery में ऐसा करते हैं:jQuery AJAX अनुरोध Jquery, Django और Google App Engine

$("#listform").submit(function() { 
      $.ajax({ 
        type: "POST", 
        url: "/xhrtest", 
        data: {'name': 'herman'}, 
        success: function(data){ 
          console.log(data) 
        } 
      }); 
    }) 

मेरी Django ध्यान में रखते हुए:

def xhrtest(request): 
     if request.method == "POST": 
       return HttpResponse("Post data!") 
     else: 
       return HttpResponse("GET request.") 

मैं होता "पोस्ट डेटा!" का उत्तर प्राप्त करने की उम्मीद है, लेकिन किसी भी तरह से जवाब हमेशा "अनुरोध प्राप्त करें" होता है। यह एक यूनिकोड मुद्दा नहीं है, क्योंकि कोई request.method प्रिंट कर सकता है और "GET" देख सकता है।

फ़ायरबग में इसका आकलन करते समय, मुझे दो अनुरोधों को देखने के लिए मिलता है: पहला पोस्ट अनुरोध, जिसे "अनुरोध प्राप्त करें" प्राप्त होता है। और उसके बाद एक अनुरोध प्राप्त करें, जो उत्तर प्राप्त करता है "अनुरोध प्राप्त करें।" भी। Google App Engine विकास कंसोल में मैं दो अनुरोधों को भी देख सकता हूं। POST अनुरोध को 301 प्रतिक्रिया के साथ पूरा किया जाता है, और 200 के साथ प्राप्त होता है।

इसका क्या अर्थ है, और मुझे POST डेटा प्राप्त करने में सक्षम होना क्या है?

+0

सही मामले में request.method (आपके django कोड में) है? यदि यह "पोस्ट" है, तो यह "POST" के बराबर नहीं होगा। – kevingessner

+0

कुछ सर्वर कॉन्फ़िगरेशन आपके POST अनुरोधों को रीडायरेक्ट कर रहा है, ऐसा लगता है। (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) – mkoistinen

उत्तर

11

समस्या लगभग निश्चित रूप से है कि आप अंतिम स्लैश के बिना यूआरएल /xhrtest का अनुरोध कर रहे हैं। डिफ़ॉल्ट रूप से, Django उस अनुरोध को /xhrtest/ पर रीडायरेक्ट करेगा - अंतिम स्लैश के साथ - और वह पुनर्निर्देशन एक पोस्ट नहीं होगा, पोस्ट नहीं होगा।

अधिक जानकारी के लिए, APPEND_SLASH सेटिंग देखें जो इस व्यवहार को कॉन्फ़िगर करती है और CommonMiddleware मॉड्यूल जो इसका उपयोग करती है।

+0

धन्यवाद, जिसने इसे हल किया। मुझे नहीं पता था कि django उस डिफ़ॉल्ट व्यवहार था। –