2

したがって、私はこのチュートリアルhttp://webcloud.se/log/AJAX-in-Django-with-jQuery/に従っていますが、get メソッドは正常に機能します。つまり、ポップアップで何を言うべきかを言うポップアップが表示されます。ただし、代わりに post メソッドを使用すると、何も得られません。リクエストが私のビューに届いていないようです。

これは、これを処理する私の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 を返すことですが、post を使用しているときは、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')),
)

同様の質問がありましたが、これほど奇妙なものはありません。私はdjango/ajax/jqueryが初めてなので、おそらく非常に小さなものが欠けています。

前もって感謝します :)

4

4 に答える 4

4

Djangoの自動CSRF保護に遭遇している可能性があります(Django for AJAXリクエストを初めて使用する人に共通の問題)。トピックに関するドキュメントを参照するか、デコレータを使用してviewメソッドにマークを付けることができます@csrf_exempt(ただし、そのメソッドに副作用がある場合やセキュリティで保護されたデータが含まれている可能性がある場合は、セキュリティの問題が発生します)。

于 2012-08-02T21:27:29.757 に答える
4

おー!わお。これは非常に小さなバグです。コードをじっと見て、それを見つけるのにしばらく時間がかかりました。リクエストしています(末尾にスラッシュがないこと/launch_instancesに注意してください)。Django がこれに遭遇すると、要求を自動的に(末尾にスラッシュを付けて) にリダイレクトしますが、リダイレクトによって POST データは破棄されます。末尾にスラッシュを追加すると、ゴールデンになります。/launch_instances/

于 2012-08-02T21:51:11.417 に答える
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();
于 2013-05-21T04:56:44.917 に答える
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()
        },
    })

これはうまくいくはずです。

于 2013-04-05T05:56:47.873 に答える