我发现了问题/错误?在带有 CSRF 的 AJAX 中。我一点也不用{% csrf_token %}
。我只使用 AJAX 表单,所以没有为 csrf 设置 cookie。在这种情况下 -在此处输入链接描述是无用的 :( 我可以使用 get_token 生成它,但我必须将它放在我所有的网站中,所以它没有任何意义。
如何在不使用 csrf 标签的情况下制作该 cookie?
我发现了问题/错误?在带有 CSRF 的 AJAX 中。我一点也不用{% csrf_token %}
。我只使用 AJAX 表单,所以没有为 csrf 设置 cookie。在这种情况下 -在此处输入链接描述是无用的 :( 我可以使用 get_token 生成它,但我必须将它放在我所有的网站中,所以它没有任何意义。
如何在不使用 csrf 标签的情况下制作该 cookie?
任何随机的 32 位字母数字字符串都将用作令牌。只需将其保存在名为“csrftoken”的 cookie 中,然后将其与您的帖子一起提交。
这将自动生成令牌或重新使用现有令牌。它将处理页面上的所有表单提交。如果您有非现场表单,则需要确保它们不运行此代码。
<script>
$(document).on('submit', 'form[method=post]', function(){
if(!document.cookie.match('csrftoken=([a-zA-Z0-9]{32})')){
for(var c = ''; c.length < 32;) c += Math.random().toString(36).substr(2, 1)
document.cookie = 'csrftoken=' + c + '; path=/'
}
if(!this.csrfmiddlewaretoken) $(this).append('<input type="hidden" name="csrfmiddlewaretoken">')
$(this.csrfmiddlewaretoken).val(document.cookie.match('csrftoken=([a-zA-Z0-9]{32})')[1])
})
</script>
需要 jQuery 1.7+
您可以在视图上使用 csrf_exempt 装饰器
https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.csrf_exempt
如果您将 csrf 令牌印入服务器端的某个 JS 变量中,那么稍后您可以发送将被 Django 识别的自定义 HTTP 标头
X-CSRFToken: {{ csrf_token }}}
另请参阅 Q&A: Django CSRF failure on ajax post requests on Opera only
工作请求示例:
POST /main/uploadpage/ HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
Content-Length: 505853
Origin: http://127.0.0.1:8000
X-File-Name: Screen Shot 2013-05-12 at 5.13.34 PM (2).png
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31
Content-Type: image/png
Cache-Control: no-cache
X-Requested-With: XMLHttpRequest
X-CSRFToken: 1kCcyDzpHIxicSzCqvuXUMbpGaXvFpCZ
Accept: */*
Referer: http://127.0.0.1:8000/main/uploadpage/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
你有考虑过禁用 CSRF 吗?
要做到这一点,只需删除中间件:'django.middleware.csrf.CsrfViewMiddleware',