Jquery 如何在Django中正确执行AJAX请求
我在模板中制作了一个带有Jquery 如何在Django中正确执行AJAX请求,jquery,django,Jquery,Django,我在模板中制作了一个带有{%csrf\u token%}标记的表单,表单输出如下: <form id="appl_detail13" action="/13/devices/" method="post"> <input type="hidden" name="csrfmiddlewaretoken" value="gTOpBTi6rljV5dKsGE0kuzD1IkghAlzW7GdiBZw6pMMaMUxJSlVev5YqPef6jhjb"> <
{%csrf\u token%}
标记的表单,表单输出如下:
<form id="appl_detail13" action="/13/devices/" method="post">
<input type="hidden" name="csrfmiddlewaretoken" value="gTOpBTi6rljV5dKsGE0kuzD1IkghAlzW7GdiBZw6pMMaMUxJSlVev5YqPef6jhjb">
<input name="appl_checkbox" id="5" type="checkbox" class="form-check-input applcheck" value="13">
</form>
Url映射器:
urlpatterns = [
# ex: /13/devices/
path('<int:application_id>/devices/', views.ApplicationDetail, name='application-detail'),
]
因此,我得到以下错误:
另外,我知道有很多关于这方面的教程,但其中很多都过时了,并且有断开的链接。您需要在ajax调用的标题中添加CSRF试试这个-
(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 "";
}
}());
您需要在ajax调用的头中添加CSRF,请尝试以下操作-
(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 "";
}
}());
如果您从表单调用,那么发送Ajax请求的方式并不完全相同(因为它会加载页面) 以下是使用csrf发送ajax请求的方式:
$.ajax({
type: "GET",
url: "/13/devices/",
beforeSend: function (xhr) {
xhr.setRequestHeader('X-CSRFToken', '{{csrf_token}}');
},
success: function (data) {
console.log(data);
}
如果您想让javascript文件接受Django,只需在javascript中声明全局变量(在您的模板script
tag中,在导入带有ajax请求的javascript之前):
如果您从表单调用,那么发送Ajax请求的方式并不完全相同(因为它会加载页面)
以下是使用csrf发送ajax请求的方式:
$.ajax({
type: "GET",
url: "/13/devices/",
beforeSend: function (xhr) {
xhr.setRequestHeader('X-CSRFToken', '{{csrf_token}}');
},
success: function (data) {
console.log(data);
}
如果您想让javascript文件接受Django,只需在javascript中声明全局变量(在您的模板script
tag中,在导入带有ajax请求的javascript之前):
我有请看我的输入与类型隐藏,它的输出工作,但为什么这必须是那么复杂?我也在等待其他答案,这并不复杂。如果javascript在模板中,则可以使用模板变量{{csrf_token}}
设置头。如果您的javascript位于单独的文件中,则会显示。您不能使用模板语言,必须从cookie中获取它。getCookie函数是通用的,可以用于许多其他脚本。或者,如果您的js位于自己的文件中,您也可以获取表单的隐藏输入字段的值,正如我所解释的。请使用类型hidden查看我的输入,这是输出,但为什么会如此复杂?我也在等待其他答案,这并不复杂。如果javascript在模板中,则可以使用模板变量{{csrf_token}}
设置头。如果您的javascript位于单独的文件中,则会显示。您不能使用模板语言,必须从cookie中获取它。getCookie函数是通用函数,可用于许多其他脚本,您可以按说明获取表单隐藏输入字段的值我看不到您在哪里声明requestUrl
我添加了一个虚拟示例我看不到您在哪里声明requestUrl
我添加了一个虚拟示例我不需要{%csrf\u token%
在我的表单中?是的,csrf只是由django cookie或Session生成的一个随机令牌。此解决方案仅在该javascript是html模板的一部分时有效。如果通过src=…
包含脚本,它将不起作用。这是将django变量传递给javascript的问题,我已将其放入编辑的答案中,我不需要{%csrf\u token%
在我的表单中?是的,csrf只是django cookie或Session生成的一个随机令牌。此解决方案仅在该javascript是html模板的一部分时有效。如果通过src=…
包含脚本,它将不起作用。这是将django变量传递给javascript的问题,我在编辑的答案中加入了该javascript
<script>
var csrfToken = {{ csrf_token }};
</script>
beforeSend: function (xhr) {
xhr.setRequestHeader('X-CSRFToken', csrfToken);
},