所以我一直在关注本教程http://webcloud.se/log/AJAX-in-Django-with-jQuery/,并且get方法运行正常。也就是说我弹出一个弹出窗口说它应该在弹出窗口中说什么。但是,当我使用post方法时,我什么也得不到。看来该请求甚至无法达到我的观点。
这就是我处理这个问题的javascript:
$(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>
这是我的views.py:
from django.http import HttpResponse
def li_view(request):
return HttpResponse("post gets to the view")
if request.is_ajax():
if request.method == 'GET':
message = "This is an XHR GET request"
elif request.method == 'POST':
message = "This is an XHR POST request"
else:
message = "Nothing"
else:
message = "No XHR"
return HttpResponse(message)
正如你所看到的,当我到达我的观点时,我做的第一件事是返回一个HttpResponse,但是当我使用帖子时,我不会看到任何弹出窗口,就像我在使用get时那样。所以我的猜测是,由于某种原因,请求甚至无法到达视图。
这就是我的urls.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的新手,所以可能会遗漏一些非常小的东西。
提前致谢:)
答案 0 :(得分:4)
您可能会遇到Django的自动CSRF保护(这是第一次使用Django进行AJAX请求的人们的常见问题)。您可能希望查看the documentation on the topic,或者可以使用@csrf_exempt
装饰器标记您的查看方法(但如果该方法有副作用或可能包含安全数据,则会引入安全问题)。
答案 1 :(得分:4)
哦!哇。这是一个小错误,我花了一段时间盯着你的代码发现它。您正在请求/launch_instances
(注意不带结尾的斜杠)。当Django遇到此问题时,它会自动将请求重定向到/launch_instances/
(带斜杠),但通过重定向,POST数据将被删除。添加尾部斜杠,你应该是金色的。
答案 2 :(得分:0)
添加{%csrf_token%}后,Django会创建一个隐藏的项目,如下所示:
< input type='hidden' name='csrfmiddlewaretoken' value='S1aE7jMFsF24X84CWKf2GxY1UoLzfpf9' / >
因此,当您使用javascript发布表单时,也应该发布隐藏的csrf_token。尝试将此值与jquery ajax调用一起添加,如下所示:
$.ajax({
type:'POST',
url: "/some/url/",
data: {
username: $("#username").val(),
csrfmiddlewaretoken: $('[name="csrfmiddlewaretoken"]').val()
},
})
这应该有用。
答案 3 :(得分:0)
如果启用了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();