2011-11-05 78 views
3

我想在Django中不使用表单元素的情况下发送一个ajax请求(通过Jquery,尽管我认为这种情况无关紧要)。根据documentation,我应该可以通过使用ensure_csrf_cookie修饰器来实现,但是,我得到了Error was: cannot import name ensure_csrf_cookie在没有表单元素的情况下在Django中使用ajax请求

我正在使用以下导入from django.views.decorators.csrf import ensure_csrf_cookie

我没有找到关于ensure_csrf_cookie的大量文档,所以任何帮助将不胜感激。

顺便说一句,使用@csrf_exempt按预期工作。

在此先感谢。

回答

6

ensure_csrf_cookie如果您在导入时遇到问题,可能只能使用1.4 alpha功能 - 我可以在主干上使用相同的语句导入它。

这里最简单的解决方案是在ajax调用中传递csrf_token VALUE。

你说你使用的是jQuery。

$.ajax({ 
     url: "", 
     type: 'POST', 
     data: { 
      csrfmiddlewaretoken: '{{ csrf_token }}' // just the token value 
     }, 
     success: function(response) { 
     } 
    }) 

看来这ensure_csrf_cookie强制视图设置将需要使用自动基于Cookie的CSRF保护机制,这里所描述的jQuery AJAX调用CSRF饼干:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

+0

我不知道'ensure_csrf_cookie'是一个1.4 alpha版本。这就是为什么我得到导入错误(我正在运行1.3)。至于你的建议,我的JavaScript没有嵌入到我的模板中,所以{{csrf_token}}不会替代实际的标记。你有解决这个问题的方法吗? –

+0

是的,在这里实现jQuery函数:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax其中一个cookie放在客户端浏览器上并带有csrf_token。它应该在大多数情况下没有这个新的1.4功能? –

+0

太好了。我对使用这种方法有点犹豫,因为它看起来很丑,但效果很好。顺便说一下,我是否应该避免使用'csrf_exempt',或者在使用ensure_csrf_cookie或刚才建议的选项时存在缺陷(安全方面)? –

1

你是对的 - 这似乎是文档中的一个错误。您应该可以使用csrf_exempt(相同的文档页面)。

+0

如果ensure_csrf_cookie是1.4阿尔法功能(如Yuji建议),那么文档只需要澄清这一点。是的,csrf_except可以工作,但ensure_csrf_cookie看起来更适合这项工作。 –

+0

是的,这不是在1.3的文档:https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/#page-uses-ajax-without-any-html-form –

+0

的确。/dev/vs /1.3/。我应该更仔细一点。 –

相关问题