2011-05-28 9 views
0

DjangoでGETデータの代わりにPOSTedデータを使用する際に問題が発生しています。POSTメソッドによるDjangoの問題

ここに私の簡素化urlpatternsクラスがあります:

urlpatterns = patterns('', 
    ('^hello/$', hello), 
    ('^hello/ajax_info/$', ajax_info), 
) 

そして、私はこのビューviews.pyファイルにしている:

def ajax_info(request): 
    if request.method == "POST": 
     print "This is a post" 
    # do stuff  

ウェブページでは、参照するとき/こんにちは/このJavaScriptを持ってまで務めましたその中に:

function loadXMLDoc(name) { 
     if (window.XMLHttpRequest) { 
      // code for IE7+, Firefox, Chrome, Opera, Safari 
      xmlhttp=new XMLHttpRequest(); 
     } else { 
      // code for IE6, IE5 
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
     } 

     xmlhttp.onreadystatechange=function(){ 
      if (xmlhttp.readyState==4 && xmlhttp.status==200) { 
       document.getElementById("myDiv").innerHTML=xmlhttp.responseText; 
       //window.onload() 

      } 
     } 

     // GET method 
     //parm = values 
     //xmlhttp.open("GET",name+"?q="+parm, true); 
     //xmlhttp.send(); 

     // POST method 
     parms = "data=" + values 
     xmlhttp.open("POST", "ajax_info", false); 
     xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded") 
     xmlhttp.send(parms) 
    } // end function loadXMLDoc 

(ウェブページにはloadXMLDoc()が呼び出されるボタンがあります

javascriptの「GETメソッド」のコメントを外して「POSTメソッド」をコメントアウトすると、私のdjangoビューが呼び出されます。

しかし、私が "GETメソッド"をコメントアウトし、 "POSTメソッド"コードを使用すると、私のビューアは呼び出されなくなります。そして、djangoのdevサーバはこれを返します:

[28/May/2011 00:15:06] "POST /hello/ajax_info HTTP/1.1" 500 69236 

明らかなものがありませんか?私の要求がPOSTであっても私のビューアに届くはずであることを示しているようです。

+0

とjavascriptのオープンコール(例ではfalse)に対するboolパラメータは重要ではないようです。同じことが成り立ち、同じ結果が得られません。 –

答えて

2

私は、あなたのビューメソッドが何も返さないという問題があると信じています。ページ/ hello/ajax_info /にアクセスし、すべてが正しく動作しているかどうかを確認してください!

この場合、DEBUG = Trueの場合、次のエラーメッセージが表示されます。 "ビューはHttpResponseオブジェクトを返しませんでした。"

何かを投稿している場合は、必ず「csrf_token」タグを使用してください...クッキーがオンになっている必要があります!

+0

私のビューメソッドは、私がPOSTを発行したときにDjangoによって呼び出されることさえありません。 –

+0

あなたが提案したとおりにページに直接アクセスすれば、それは動作します()次に、ajaxを使わずにページにPOSTを試してみてください...単純なフォームが実行されます!.. GETで動作する場合、 POSTメソッドでバグが生成されますが、「これは投稿です」というメッセージが表示されない場合、途中で何かが死んでしまいました。私の勘違いはCSRFの保護です...https://docs.djangoproject.com/en/dev/ref/contrib/csrf/ – StefanNch

2

私はdjangoに慣れていませんが、500はHTTPステータスコードのように見えます。これはあなたの応答が悪いことを示しています。 Firebug、Chromeのツール、Opera DragonflyなどのJavaScriptデバッガで何が起こるかを見てみましょう。

ちなみに、クライアントコードにはjQueryのようなライブラリを使用することができます。手動のajaxは大規模な頭痛です。

2

あなたの問題は、ブラウザでajaxをデバッグする方法を理解できないことです。

このhttp://wiki.pylonshq.com/display/pylonscookbook/Debugging+AJAX+requests+using+Firebugを読んでから、このテクニックを使って正確にAjaxビューをクラッシュさせる方法を見つけてください。

+0

うわー、ありがとう。デバッグハウツーがこれを明らかにしました: 禁止(403) CSRFの確認に失敗しました。リクエストが中止されました。 –

1

私はいつかPOSTとajaxが "/"で終わるように強制すると正しく動作しないという問題を覚えています。私は試してみる価値があると思う。

urlpatterns = patterns('', 
    ('^hello/$', hello), 
    ('^hello/ajax_info$', ajax_info), # Removed ending slash 
) 
+0

これは修正されませんが、HTTP応答エラーコードは500から403に変更されます。 –