2012-08-02 36 views
2

所以我一直在關注本教程http://webcloud.se/log/AJAX-in-Django-with-jQuery/,並且get方法正常工作。即我彈出了一個彈出窗口,說明它應該在彈出窗口中說什麼。但是,當我使用post方法時,我什麼也沒有得到。看起來這個請求甚至沒有達到我的看法。在django中使用ajax時無法發帖

這是我的JavaScript處理這個問題有點樣子:

$(document).ready(function(){ 

    $("#popupbutton").click(function(){ 
     $.post("/launch_instances", { 
       name: "Monty", 
       food: "Spam" 
      }, 
      function(data) { 
       alert(data); 
      } 
     ); 
    }); 
................... 

這是我的模板的相關位:

<center> 
    <div id="popupbutton"><input type="submit" value="Launch Instances!" /></div> 
</center> 

這裏是我的views.py:

from django.http import HttpResponse 

def li_view(request): 
    return HttpResponse("post gets to the view") 
    if request.is_ajax(): 
     if request.method == 'GET': 
      message = "This is an XHR GET request" 
     elif request.method == 'POST': 
      message = "This is an XHR POST request" 
     else: 
      message = "Nothing" 
    else: 
     message = "No XHR" 

    return HttpResponse(message) 

正如你可以看到我做的第一件事,當我看到我的視圖是返回一個HttpResponse,但是當我是你當我使用get時,我看不到任何彈出窗口。所以我的猜測是,出於某種原因,請求甚至沒有達到視圖。

這是我的urls.py:

from django.conf.urls import patterns, include, url 
from django.contrib import admin 

admin.autodiscover() 

urlpatterns = patterns('', 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^launch_instances/', 'simdata.views.li_view'), 

    # Uncomment the admin/doc line below to enable admin documentation: 
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), 
) 

也出現了類似的問題,但周圍沒有什麼作爲作爲的bizzare此。我是django/ajax/jquery的新手,所以可能會丟失一些非常小的東西。

感謝提前:)

+0

你的'urls.py'裏有什麼?也許錯誤在那裏? – 2012-08-02 21:22:43

+0

@CypressFrankenfeld我已經添加了我的urls.py :) – AmirHBP 2012-08-02 21:28:00

+1

如果您使用的是現代瀏覽器,如最近的Chrome或Firefox(使用Firebug),您應該可以使用開發人員工具來了解您的請求發生了什麼。例如,在Chrome中,您應該先打開開發人員控制檯(扳手 - >工具 - >開發人員工具),然後轉到網絡選項卡,然後觸發您的AJAX呼叫。然後您可以看到應該幫助您調試的狀態碼和響應內容。 – 2012-08-02 21:38:22

回答

4

哦!哇。這是一個小問題,我花了一段時間盯着你的代碼發現它。您正在請求/launch_instances(注意沒有末尾的斜線)。當Django遇到這種情況時,它會自動將請求重定向到/launch_instances/(帶有斜線),但通過重定向,POST數據將被丟棄。添加尾部斜線,你應該是金色的。

+0

是的,你是對的。我才意識到它着眼於Chrome瀏覽器後調試器,並來到這裏說,謝謝你:) – AmirHBP 2012-08-02 22:05:54

4

你可能運行到Django的自動CSRF保護(使用Django的AJAX人民的共同問題請求第一次)。您可能需要查看the documentation on the topic,或者您可以使用@csrf_exempt裝飾器標記您的視圖方法(儘管如果該方法具有副作用或可能包含受保護的數據,則會引發安全問題)。

+0

我試着做什麼教程說,但它沒有得到我的任何地方。剛纔我加這兩條線正上方我的方法重新啓動,並從django.views.decorators.csrf導入服務器,但還是老樣子沒有什麼:( csrf_exempt @csrf_exempt – AmirHBP 2012-08-02 21:33:47

0

加入{%csrf_token%}後,Django會創建一個隱藏的項目類似以下內容:

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

所以,當你使用JavaScript發佈形式,隱藏csrf_token應張貼爲好。沿試着與你的jquery ajax調用添加此值是這樣的:

$.ajax({ 
     type:'POST', 
     url: "/some/url/", 
     data: { 
      username: $("#username").val(), 
      csrfmiddlewaretoken: $('[name="csrfmiddlewaretoken"]').val() 
     }, 
    }) 

,這應該工作。

0

如果您的CSRF已啓用,那麼簡單的ajax後無效。您將不得不添加csrf標記並將其設置爲ajax請求標頭。

對於Ajax POST請求,您必須在每個POST請求中將CSRF令牌作爲POST數據傳遞。出於這個原因,您必須首先獲得CSRF令牌。由於您已啓用CSRF保護,所以您將從csrftoken cookie獲取令牌。默認情況下,CSRF令牌cookie被命名爲csrftoken。獲取令牌非常簡單,可以使用下面的代碼片段來實現。

enter code here 
function getCSRFCookie() 
{ 
name = 'csrftoken'; 
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]); 

      if (cookie.substring(0, name.length + 1) == (name + '=')) { 
       cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
       break; 
      } 
     } 
    } 
    return cookieValue; 
} 
var csrf_token = getCSRFCookie();