1

Ajax コードはサーバーにリクエストを送信できませんが、同じ URL に対して通常の http リクエストを行うと機能します。URL フィールドを「http://」URL に置き換えようとしましたが、まだ機能しません。誰でもアイデアがありますか?

Environment:

django 1.5.4;
python 2.7.4;
jquery 2.0.3;

test.html

<html>
    <head>
            <title></title>
            <script type='text/javascript' src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
            <script type="text/javascript">
            $(document).ready(function() {
                    $("#button").click(function(){
                            $.ajax({
                                    type : "POST",
                                    url : "{% url 'getlist' %}",
                                    data : {
                                            msg : 'abcd'
                                    },
                            }).done(function(data){
                                    alert(data.message);
                            });
                    });
            });     
            </script>
    </head>
    <body>
            <input id="button" type="button" value="Get message from server!">
            {% if resource_list %}
            <ul>
                    {% for resource in resource_list %}
                    <li><a href="{{ resource.url }}">{{ resource.name }}</a></li>
                    {% endfor %}
            </ul>
            {% else %}
            <p>No Resources</p>
            {% endif %}
    </body>

view.py

def getList(request):
    print "Reach getLists"
    if request.is_ajax():
            try:
                    msg = request.POST['msg']
            except:
                    return HttpResponse(simplejson.dumps({'message':'Error From Server'}))
            return HttpResponse(simplejson.dumps({'message':msg}))
    else:
            return HttpResponse(simplejson.dumps({'message':'Not an ajax request'}))

urls.py

url(r'^test$', views.test),
url(r'^getlist/$', views.getList, name='getlist'),

====================================更新============= ======================== エラー情報

Forbidden (403)

CSRF 検証に失敗しました。リクエストは中止されました。ヘルプ 失敗の理由: CSRF トークンが見つからないか、正しくありません。

============================= 解決済み ================== ===============
解決策: JavaScript ファイルのデータ フィールドに「csrfmiddlewaretoken:'{{ csrf_token }}',」を追加すると、動作しました。その理由は、django が CSRF 保護を有効にしているためです。

============================== ありがとう ================== =================
@dkp2442 と @Christian Ternus、特に @dkp2442 の助けに感謝します。

4

2 に答える 2

2

さて、Gistを作成したのですが、なんとなく内緒にしてしまいました(編集してもいいですか??笑)。とにかく、投稿に csrftoken を含める必要があります。これが私の答えです:

    function getCookie(name) {
        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]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }

その getCookie 関数を任意の投稿に使用できます。次のように含めるだけです。

     $(document).ready(function() {
        $("#button").click(function(){
            $.ajax({
                type : "POST",
                url : "{% url 'getlist' %}",
                data : {
                    msg : 'abcd',
                    csrfmiddlewaretoken: getCookie('csrftoken')
                }
            }).done(function(data){
                alert(data.message);
            });
        });
    });
于 2013-10-08T20:39:53.397 に答える
0

csrf の django docs ページのajax セクションを読んでください。

于 2013-10-08T20:39:03.220 に答える