【问题标题】:Ajax + Django: how to properly send few things from client browser to server?Ajax + Django:如何正确地将一些东西从客户端浏览器发送到服务器?
【发布时间】:2012-06-26 05:25:39
【问题描述】:

在我的应用程序中,有几类数据需要从客户端浏览器发送到服务器。 后端在 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”:“测试” }

我的问题解决了。

【问题讨论】:

  • POST 需要 CSRF 令牌
  • 除了 A. Vasinov 所说的之外,您还可以通过使用 @csrf_exempt 装饰您的视图来避免 CSRF 检查。
  • 也谢谢你,尤其是 Idiqual。

标签: ajax django post extjs request


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    在您的模板文件中(假设您使用 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>
    

    【讨论】:

    • 有趣.. 我什至不确定这是否是原因。首先,我不是在处理表单提交,而是来自前端的纯 ajax 请求。我确实在服务器中使用了代理来解决这个跨域请求问题。然后根据 Idiqual 的建议,我将 @csrf_exempt 放入该 Django 视图脚本中,并将 ExtJS ajax 代码从使用 jsonData 更改为 params,然后一切正常...
    • 默认情况下,Django 需要 每个 POST 的 CSRF 令牌。你能用 GET 代替吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 2020-02-28
    相关资源
    最近更新 更多