Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery can';在django中使用ajax时不能发布_Jquery_Ajax_Django_Post - Fatal编程技术网

Jquery can';在django中使用ajax时不能发布

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:

所以我一直在学习本教程,get方法工作得很好。i、 我得到一个弹出窗口,上面写着它应该在弹出窗口中说什么。然而,当我使用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>
正如你所看到的,当我进入我的视图时,我做的第一件事就是返回一个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();