1

在我的应用程序中,有几类数据需要从客户端浏览器发送到服务器。后端在 Django 中。我正在尝试使用 Ajax 将数据发布到 Django 中的视图函数,然后将某些内容返回给客户端。我试过的代码如下:

在 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:

    参数:{“rID”:1333,“rName”:“测试”}

我的问题解决了。

4

2 回答 2

0

对于 ajax POST,您需要 CSRF 令牌,并且简单地禁用它是不明智的,@csrf_exempt因为它违背了目的。如果您不想要 CSRF 保护,请'django.middleware.csrf.CsrfViewMiddleware'从 MIDDLEWARE_CLASSES 中删除。

Django 文档提供了一个 jQuery 函数,该函数会自动将令牌添加到所有 ajax 请求中:https ://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

我对 ExtJS 没有任何经验,但你会想找到一个等价的。以下是您可以查看的一些片段:

于 2012-06-24T23:56:53.677 回答
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 回答