Jquery can';在django中使用ajax时不能发布
所以我一直在学习本教程,get方法工作得很好。i、 我得到一个弹出窗口,上面写着它应该在弹出窗口中说什么。然而,当我使用post方法时,我什么也得不到。看起来请求甚至没有到达我的视图 这就是我的javascript处理这个问题的方式:Jquery can';在django中使用ajax时不能发布,jquery,ajax,django,post,Jquery,Ajax,Django,Post,所以我一直在学习本教程,get方法工作得很好。i、 我得到一个弹出窗口,上面写着它应该在弹出窗口中说什么。然而,当我使用post方法时,我什么也得不到。看起来请求甚至没有到达我的视图 这就是我的javascript处理这个问题的方式: $(document).ready(function(){ $("#popupbutton").click(function(){ $.post("/launch_instances", { name:
$(document).ready(function(){
$("#popupbutton").click(function(){
$.post("/launch_instances", {
name: "Monty",
food: "Spam"
},
function(data) {
alert(data);
}
);
});
...................
这是我的模板的相关部分:
<center>
<div id="popupbutton"><input type="submit" value="Launch Instances!" /></div>
</center>
正如你所看到的,当我进入我的视图时,我做的第一件事就是返回一个HttpResponse,但是当我使用post时,我没有看到任何像我使用get时那样的弹出窗口。因此,我的猜测是,出于某种原因,请求甚至没有到达视图
这是my URL.py的内容:
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^launch_instances/', 'simdata.views.li_view'),
# Uncomment the admin/doc line below to enable admin documentation:
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
)
周围也有类似的问题,但没有比这更奇怪的了。我是django/ajax/jquery新手,所以可能遗漏了一些非常小的东西
提前感谢:)您可能会遇到Django的自动CSRF保护(对于首次使用Django进行AJAX请求的人来说,这是一个常见问题)。您可能想查看,或者您可以使用
@csrf\u emption
decorator标记您的视图方法(尽管如果该方法有副作用或可能包含安全数据,这将导致安全问题)。哦!哇!这是一个很小的bug,我花了一段时间盯着你的代码才发现它。您正在请求/launch\u实例
(请注意,末尾没有尾随斜杠)。当Django遇到这种情况时,它会自动将请求重定向到/launch\u instances/
(带尾随斜杠),但通过重定向,POST数据会被删除。添加尾部斜杠,您应该是金色的。在添加{%csrf_token%}后,Django会创建一个隐藏项,如下所示:
< input type='hidden' name='csrfmiddlewaretoken' value='S1aE7jMFsF24X84CWKf2GxY1UoLzfpf9' / >
这应该是可行的。如果您启用了CSRF,那么简单的ajax帖子就不起作用了。您必须添加csrf令牌并将其设置为ajax请求头 对于Ajax POST请求,您必须在每个POST请求中将CSRF令牌作为POST数据传递进来。因此,您必须首先获得CSRF令牌。由于您已启用CSRF保护,因此您将从csrftoken cookie获取令牌。默认情况下,CSRF令牌cookie的名称为csrftoken。获取令牌非常简单,可以使用下面的代码片段实现
enter code here
function getCSRFCookie()
{
name = 'csrftoken';
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrf_token = getCSRFCookie();
在此处输入代码
函数getCSRFCookie()
{
名称='csrftoken';
var-cookieValue=null;
if(document.cookie&&document.cookie!=''){
var cookies=document.cookie.split(“;”);
对于(变量i=0;i
你的url.py中有什么?可能是有漏洞吗?@cypresfrankenfeld我已经添加了我的url.py:)如果你使用的是像最近的Chrome或Firefox(带有Firebug)这样的现代浏览器,你应该能够使用开发者工具来了解你的请求发生了什么。例如,在Chrome中,在触发AJAX调用之前,您应该打开开发者控制台(扳手->工具->开发者工具)并转到网络选项卡。然后,您可以看到状态代码和响应内容,这应该有助于您进行调试。在jquery帖子中,请尝试使用“/launch\u instances/”而不是“/launch\u instances”。@MichaelC.O'Connor感谢您提供了这个很棒的工具。我的状态文本显示“500 internal server error”,但我没有任何名为response Contents的专栏。我试着按照教程所说的去做,但没有成功。刚才我在我的方法上方添加了这两行代码,并重新启动了服务器,但仍然一无所获:(来自django.views.decorators.csrf import-csrf_-emption@csrf_-emption是的。我在查看chrome调试器后才意识到这一点,我来这里是想说这一点的。谢谢男人:)
$.ajax({
type:'POST',
url: "/some/url/",
data: {
username: $("#username").val(),
csrfmiddlewaretoken: $('[name="csrfmiddlewaretoken"]').val()
},
})
enter code here
function getCSRFCookie()
{
name = 'csrftoken';
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrf_token = getCSRFCookie();