Django POST方法问题
我在使用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 个回答
你的问题是你不太明白怎么在浏览器里调试ajax。
可以看看这个链接 http://wiki.pylonshq.com/display/pylonscookbook/Debugging+AJAX+requests+using+Firebug,然后用里面的方法来找出到底是什么导致你的ajax视图出错。
我对django不太熟悉,但那个500
看起来像是一个HTTP状态码,表示你的响应有问题。你可以试着用JavaScript调试工具看看发生了什么,比如Firebug、Chrome的开发者工具、Opera Dragonfly等等。
顺便说一下,你可能想用像jQuery这样的库来处理客户端代码。手动写ajax代码会让人头疼。
我觉得问题出在你的视图方法没有返回任何东西……试着访问页面 /hello/ajax_info/,看看一切是否正常!
如果真是这样的话,当你把 DEBUG 设置为 True 时,你会看到这个错误信息:“视图……没有返回一个 HttpResponse 对象。”
另外,如果你要发送 POST 请求,记得使用 "csrf_token" 标签……确保你的浏览器开启了 Cookies!