1

私のアプリでは、クライアントブラウザからサーバーに送信する必要のあるデータのカテゴリがいくつかあります。バックエンドはDjangoにあります。Ajaxを使用してデータをDjangoのビュー関数にPOSTしてから、クライアントに何かを返そうとしています。私が試したコードは次のとおりです。

Django urls.pyの場合:

 (r'^testPost/', testPost),

Djangoビュー機能:

def testPost(request):
    print request
    if request.method == 'GET':
        rID = request.GET['rID']
        rName = request.GET['rName'] 
    elif request.method == 'POST':
        rID = request.POST['rID']
        rName = request.POST['rName'] 

    return HttpResponse("ID: " + str(rID) + " and Name: " + str(rName))

フロントエンドAJAX呼び出し(ExtJS 3.3):

 Ext.Ajax.request({ 
        url: 'XXXX/testPost/?',
        method: 'POST',
        jsonData: Ext.encode({
            "rID": 1333,
                    "rName": 'test'
        }),
        headers: {
            'Content-Type': 'application/json'
        },
        success: function (response, opts){
                    console.log(response.responseText);
                }, 
                failure:function (response, opts){
                    console.log(response.responseText);
                } 
});

URL設定に問題があるようです。エラー応答がありました:

Some unexpected error occurred. Error text was: HTTP Error 403: FORBIDDEN

更新: 1。ldiqualのアドバイスに基づいて、

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt

ビュースクリプトで

  1. ExtJS ajaxリクエストコードをjsonDataの使用からparamsに変更しました:

    params:{"rID":1333、 "rName":'test'}

私の場合、問題は解決しました。

4

2 に答える 2

0

テンプレートファイル(jQueryライブラリを使用していると仮定):

<form id="MyForm" action="." method="POST">
    {% csrf_token %}
    {{ form.as_table }}
    <input type="submit" class="default" value="Save" onclick="PostThisToAjax(jQuery("#MyForm").serialize()); return false;" />
</form>
于 2012-06-24T21:15:32.870 に答える
0

ajax POSTの場合、CSRFトークンが必要になりますが@csrf_exempt、目的が果たせないため、単に無効にするのは賢明ではありません。CSRF保護が必要ない場合は'django.middleware.csrf.CsrfViewMiddleware'、MIDDLEWARE_CLASSESから削除してください。

Djangoドキュメントは、すべてのajaxリクエストにトークンを自動的に追加するjQuery関数を提供します:https ://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

私はExtJSの経験はありませんが、同等のものを見つけたいと思うでしょう。表示できるスニペットは次のとおりです。

于 2012-06-24T23:56:53.677 に答える