Django POST方法问题

0 投票
4 回答
4939 浏览
提问于 2025-04-16 18:30

我在使用Django的时候遇到了一个问题,就是我想用POST方式发送的数据,但却不想用GET方式。

这是我简化后的网址模式类:

urlpatterns = patterns('',
    ('^hello/$', hello),
    ('^hello/ajax_info/$', ajax_info),   
)

在views.py文件中,我有这样一个视图:

def ajax_info(request):
    if request.method == "POST":
        print "This is a post"
    # do stuff    

当你访问/hello/这个网页时,它里面有一些JavaScript代码:

    function loadXMLDoc(name) {
        if (window.XMLHttpRequest) {
            // code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
        } else {
            // code for IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }

        xmlhttp.onreadystatechange=function(){
            if (xmlhttp.readyState==4 && xmlhttp.status==200) {
                document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
                //window.onload()

            }
        }

        // GET method
        //parm = values
        //xmlhttp.open("GET",name+"?q="+parm, true);
        //xmlhttp.send();

        // POST method
        parms = "data=" + values
        xmlhttp.open("POST", "ajax_info", false);
        xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
        xmlhttp.send(parms)
    } // end function loadXMLDoc

(在这个网页上,我有一个按钮,按下后会调用loadXMLDoc()这个函数)

如果我把JavaScript中的“GET方法”那一行取消注释,并把“POST方法”注释掉,那么我的Django视图就会被调用。

但是如果我把“GET方法”注释掉,使用“POST方法”的代码,那么我的视图根本不会被调用。Django开发服务器会返回这个:

[28/May/2011 00:15:06] "POST /hello/ajax_info HTTP/1.1" 500 69236

我是不是漏掉了什么明显的东西?这些例子似乎表明,即使是POST请求,我的视图也应该能被调用。

4 个回答

2

你的问题是你不太明白怎么在浏览器里调试ajax。

可以看看这个链接 http://wiki.pylonshq.com/display/pylonscookbook/Debugging+AJAX+requests+using+Firebug,然后用里面的方法来找出到底是什么导致你的ajax视图出错。

2

我对django不太熟悉,但那个500看起来像是一个HTTP状态码,表示你的响应有问题。你可以试着用JavaScript调试工具看看发生了什么,比如Firebug、Chrome的开发者工具、Opera Dragonfly等等。

顺便说一下,你可能想用像jQuery这样的库来处理客户端代码。手动写ajax代码会让人头疼。

2

我觉得问题出在你的视图方法没有返回任何东西……试着访问页面 /hello/ajax_info/,看看一切是否正常!

如果真是这样的话,当你把 DEBUG 设置为 True 时,你会看到这个错误信息:“视图……没有返回一个 HttpResponse 对象。”

另外,如果你要发送 POST 请求,记得使用 "csrf_token" 标签……确保你的浏览器开启了 Cookies!

撰写回答