JQuery AJAX django 获取 csrf 错误 403
JQuery AJAX with django getting csrf error 403
Getting Error CSRF 验证失败。请求中止。令牌丢失或不正确。
我是 JQuery 的新手,不确定它是否会导致我的错误。我想我正在正确地传递请求。
接受 Cookie 并且更简单的 JQuery 请求更早工作。
观看次数
def testcall(request):
text = request.POST['text']
if request.method == 'POST' and request.POST['action'] == 'start_function1':
function1(text)
response = text + "has been successful"
return HttpResponse(response)
if request.method == 'POST' and request.POST['action'] == 'start_function2':
function2(text)
response = text + "has been successful"
return HttpResponse(response)
模板
<html>
<head>
<title>Test Data</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script>
jQuery(document).ready(function($){
$('demo-form').on('submit', function(event){
event.preventDefault();
var text = document.getElementById('text-to-analyze').value;
$.ajax({
url : '{{ 'my-ajax-testsub/' }}',
type : "POST",
data: {
csrfmiddlewaretoken: '{{ csrf_token }}',
text: text,
action: 'start_function1'
},
success: function callback(response){
alert(response);
},
});
})})
jQuery(document).ready(function($){
$('demo-form').on('submit', function(event){
event.preventDefault();
var text = document.getElementById('text-to-analyze').value;
$.ajax({
url : '{{ 'my-ajax-testunsub/' }}',
type : "POST",
data: {
csrfmiddlewaretoken: '{{ csrf_token }}',
text: text,
action: 'start_function2'
},
success: function callback(response){
alert(response);
},
});
})})
</script>
</head>
<body>
<form name="demo-form" method="POST" action="{% url 'home' %}">
<p>Input field: <input type="text" id="text-to-analyze" value="name@gmail.com"></p><br>
<button class="btn btn-success" name="start_function1">Function</button>
<button class="btn btn-success" name="start_function2">Function</button>
</form>
</body>
</html>
这不是您呈现 csrf_token 的方式,您必须使用 {% csrf_token %}
。所以目前,它发送 csrf_token 作为空白。
但不管怎样,这并不重要。您必须从 HTML 中获取 csrf_token - 在它呈现之后。因为 Django 将 {% csrf_token %}
替换为 unique 标记(实际上是 input
),所以它无论如何都是不正确的。
data: {
csrfmiddlewaretoken: $($('input[name="csrfmiddlewaretoken"]').attr('value')),
text: text,
action: 'start_function1'
},
即使这样也可能行不通。您可能需要将其设置为页眉。
$.ajaxSetup({
beforeSend: function(xhr) {
xhr.setRequestHeader('Csrf-Token', token);
}
});
[...]
data: {
csrfmiddlewaretoken: $($('input[name="csrfmiddlewaretoken"]').attr('value')),
text: text,
action: 'start_function1'
},
[...]
Getting Error CSRF 验证失败。请求中止。令牌丢失或不正确。 我是 JQuery 的新手,不确定它是否会导致我的错误。我想我正在正确地传递请求。 接受 Cookie 并且更简单的 JQuery 请求更早工作。
观看次数
def testcall(request):
text = request.POST['text']
if request.method == 'POST' and request.POST['action'] == 'start_function1':
function1(text)
response = text + "has been successful"
return HttpResponse(response)
if request.method == 'POST' and request.POST['action'] == 'start_function2':
function2(text)
response = text + "has been successful"
return HttpResponse(response)
模板
<html>
<head>
<title>Test Data</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script>
jQuery(document).ready(function($){
$('demo-form').on('submit', function(event){
event.preventDefault();
var text = document.getElementById('text-to-analyze').value;
$.ajax({
url : '{{ 'my-ajax-testsub/' }}',
type : "POST",
data: {
csrfmiddlewaretoken: '{{ csrf_token }}',
text: text,
action: 'start_function1'
},
success: function callback(response){
alert(response);
},
});
})})
jQuery(document).ready(function($){
$('demo-form').on('submit', function(event){
event.preventDefault();
var text = document.getElementById('text-to-analyze').value;
$.ajax({
url : '{{ 'my-ajax-testunsub/' }}',
type : "POST",
data: {
csrfmiddlewaretoken: '{{ csrf_token }}',
text: text,
action: 'start_function2'
},
success: function callback(response){
alert(response);
},
});
})})
</script>
</head>
<body>
<form name="demo-form" method="POST" action="{% url 'home' %}">
<p>Input field: <input type="text" id="text-to-analyze" value="name@gmail.com"></p><br>
<button class="btn btn-success" name="start_function1">Function</button>
<button class="btn btn-success" name="start_function2">Function</button>
</form>
</body>
</html>
这不是您呈现 csrf_token 的方式,您必须使用 {% csrf_token %}
。所以目前,它发送 csrf_token 作为空白。
但不管怎样,这并不重要。您必须从 HTML 中获取 csrf_token - 在它呈现之后。因为 Django 将 {% csrf_token %}
替换为 unique 标记(实际上是 input
),所以它无论如何都是不正确的。
data: {
csrfmiddlewaretoken: $($('input[name="csrfmiddlewaretoken"]').attr('value')),
text: text,
action: 'start_function1'
},
即使这样也可能行不通。您可能需要将其设置为页眉。
$.ajaxSetup({
beforeSend: function(xhr) {
xhr.setRequestHeader('Csrf-Token', token);
}
});
[...]
data: {
csrfmiddlewaretoken: $($('input[name="csrfmiddlewaretoken"]').attr('value')),
text: text,
action: 'start_function1'
},
[...]