我收到的CSRF_Token错误只发生在我的服务器上的生产模式中。但是当我使用runserver命令从我的计算机终端运行它时,一切都很好。我已经阅读了许多与此相关的其他问题而没有运气。似乎我的情况与其他情况略有不同,因为它在本地工作但不在生产中。
我在提交一个提交到views.py中的“submit”的Ajax表单时收到错误。有人知道是什么原因引起的吗?另外,在生产模式下查看我的cookie,CSRF_Token甚至没有开始。本地就是。谢谢你的帮助。
这是我的views.py
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return render(request, 'index.html')
def submit(request):
#Receive Request
inputone = request.POST['randominfo']
inputtwo = request.POST['randominfo2']
#Some more code here that setups response.
#Deleted since Im posting to StackOverflow
return response
与Ajax提交有关的代码
$(function () {
$.ajaxSetup({
headers: { "X-CSRFToken": getCookie("csrftoken") }
});
});
function getCookie(c_name)
{
if (document.cookie.length > 0)
{
c_start = document.cookie.indexOf(c_name + "=");
if (c_start != -1)
{
c_start = c_start + c_name.length + 1;
c_end = document.cookie.indexOf(";", c_start);
if (c_end == -1) c_end = document.cookie.length;
return unescape(document.cookie.substring(c_start,c_end));
}
}
return "";
}
function submitAjax(event){
$.ajax({
type:'POST',
url:'/submit/',
data:{
randominfo:document.getElementById('Random').innerHTML,
randominfo2:document.getElementById('Random2').innerHTML,
},
dateType: 'json',
success:function() {
# Url here
}
})
};
修复此问题的解决方案。
在views.py中添加“来自django.views.decorators.csrf import ensure_csrf_cookie”,然后在返回包含ajax表单的html文件的视图上方添加“@ensure_csrf_cookie”
答案 0 :(得分:1)
错误发生是因为您没有设置csrf令牌,为了防止这种情况,我们必须检查一些细节
首先,您必须将csrf令牌设置为您的表单,在您的html中,您必须设置如下:
<form id="id" name="form">
{% csrf_token %}
<!-- Form body here -->
</form>
第二种将csrf cookie设置为您的请求标头的方法是可以的,我只建议您逐个设置数据字段,使用jquery的方法serialize
data: $("#your-form-id").serialize()
我建议您阅读此post关于使用django的ajax请求非常有帮助
答案 1 :(得分:0)
你可以做两件事:
1。)在ajax调用中提交CSRF令牌。您必须使用getCookie()
javascript函数才能获得它。幸运的是,您可以复制和粘贴django文档has some code。
的JavaScript
$.ajax({
type:'POST',
url:'/submit/',
data:{
randominfo:document.getElementById('Random').innerHTML,
randominfo2:document.getElementById('Random2').innerHTML,
'csrfmiddlewaretoken': getCookie('csrftoken'), // add this
...
2.。)为您的/ submit视图禁用csrf。你可以用装饰器做到这一点。请注意,这样不太安全,因此请确保没有机密数据。
views.py:
from django.views.decorators.csrf import csrf_exempt
...
@csrf_exempt
def your_submit_view(request):
#view code