仅在生产中缺少 Django CSRF 令牌
Django CSRF Token Missing Only in Production
我收到一个丢失的 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 Whosebug
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 中添加 "from django.views.decorators.csrf import ensure_csrf_cookie",然后在 returns 包含 [=35= 的 html 文件的视图上方添加“@ensure_csrf_cookie” ] 表格
错误发生是因为您没有设置 csrf 令牌,为了防止这种情况,我们必须检查一些细节
首先,您必须将 csrf 令牌设置为您的表单,在您的 html 中,您必须设置如下:
<form id="id" name="form">
{% csrf_token %}
<!-- Form body here -->
</form>
第二种将 csrf cookie 设置为您的请求的方法 header 是可以的,我只建议您使用 [=27= 的方法 serialize
而不是一个一个地设置您的数据字段]
data: $("#your-form-id").serialize()
我想推荐你阅读这个post关于ajax使用django请求非常有帮助
您可以做两件事:
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
我收到一个丢失的 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 Whosebug
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 中添加 "from django.views.decorators.csrf import ensure_csrf_cookie",然后在 returns 包含 [=35= 的 html 文件的视图上方添加“@ensure_csrf_cookie” ] 表格
错误发生是因为您没有设置 csrf 令牌,为了防止这种情况,我们必须检查一些细节
首先,您必须将 csrf 令牌设置为您的表单,在您的 html 中,您必须设置如下:
<form id="id" name="form">
{% csrf_token %}
<!-- Form body here -->
</form>
第二种将 csrf cookie 设置为您的请求的方法 header 是可以的,我只建议您使用 [=27= 的方法 serialize
而不是一个一个地设置您的数据字段]
data: $("#your-form-id").serialize()
我想推荐你阅读这个post关于ajax使用django请求非常有帮助
您可以做两件事:
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