如何在没有跨站点请求伪造错误的情况下在Django 1.0中执行AJAX POST?

时间:2012-03-27 23:43:46

标签: jquery ajax django

我正在使用jQuery来执行AJAX POST,但是收到CSRF错误。我假设这是因为CSRF cookie没有发送给客户端发回。有没有办法在Django 1.0中解决这个问题?

2 个答案:

答案 0 :(得分:1)

Yuji的建议指出了我正确的方向。

我是从一个GET结果的视图中进行AJAX POST,因此Django中间件没有生成任何csrf令牌。

我使用了csrf中间件(/usr/lib/python2.5/site-packages/django/contrib/csrf/middleware.py)中的代码来生成一个csrf令牌,我用GET上下文发送该令牌。现在AJAX POST工作正常,因为令牌存在。

创建csrf标记:

def csrf_token_create(request):

    from django.contrib.csrf.middleware import _make_token    

    try:
        session_id = request.COOKIES[settings.SESSION_COOKIE_NAME]
    except KeyError:
        # No session, no check required
        return None

    csrf_token = _make_token(session_id)
    return csrf_token

在视图上下文中:

csrf_token = csrf_token_create(request)
return render_to_response('view.html', {'csrfmiddlewaretoken': csrf_token})

在html模板中为csrfmiddlewaretoken添加隐藏输入。

答案 1 :(得分:0)

django 1.4的文档包含了您的代码。 https://docs.djangoproject.com/en/1.4/ref/contrib/csrf/

我可能认为这也适用于django 1.0,因为您对代码的处理基本上只是将jquery函数添加到页面加载的任何js文件中。 对于1.4版,我们必须在django模板的表单元素中添加{%csrf_token%}标签。试试这个!