Django 1.3中的Ajax CSRF问题

nuk*_*ukl 6 django ajax csrf

根据django文档,对于1.3中的ajax post请求(至少使用Jquery),我们只需要将此片段添加到主js文件中.此代码段从cookie获取csrftoken,然后为所有ajax请求设置它.这是有效的,但是如果csrftoken在cookie中不存在怎么办?我认为render_to_response和渲染都会自动检查会话中是否有csrftoken,如果不存在令牌,则为我们设置.但他们不是.所以,我需要自己实现它?或者也许有另一种方法来处理ajax csrf保护?

Tei*_*ilo 11

如果页面上没有已使用{%csrf_token%}的表单,则不会发送cookie.因此,正如您所指出的,当您尝试在此类页面上使用Ajax时,您将收到错误消息.如果您的网站混合了各种表单和ajax帖子的组合,这将导致不稳定的行为.

这已经被报道并修复: https://code.djangoproject.com/ticket/15354

补丁中的解决方案,将推出1.3.1,是ensure_cookie_csrf装饰器.该装饰器在1.3或1.2.5中不存在

但是,无需等待.只需将此行添加到包含AJF帖子和CSRF表单的任何视图中:

request.META["CSRF_COOKIE_USED"] = True
Run Code Online (Sandbox Code Playgroud)

例:

def calculator(request):
    request.META["CSRF_COOKIE_USED"] = True
    return render_to_response('calc.html', {'form': CalcForm()})
Run Code Online (Sandbox Code Playgroud)

仅供参考 - 这正是装饰者所做的.


oji*_*jii 3

如果模板中使用了模板标签{% csrf_token %}来生成请求,或者get_token您request从django.middleware.csrf.

该get_token函数在对象上设置元信息request,进而告诉django.middleware.csrf.CsrfViewMiddleware中间件设置 cookie。