【发布时间】:2011-04-17 21:27:24
【问题描述】:
我正在使用 Django 1.2.3 开发网站。我的 ajax get 请求工作正常,但 post 请求在开发模式下工作(127.0.0.1:8000),但当我使用 apache + nginx 将网站投入生产时却不行。
这是一个例子
urls.py:
(r'api/newdoc/$', 'mysite.documents.views.newdoc'),
views.py
def newdoc(request):
# only process POST request
if request.is_ajax():
data= dict(request.POST)
# save data to db
return HttpResponse(simplejson.dumps([True]))
在javascript中:
$.post("/api/newdoc/", {data : mydata}, function(data) { alert(data);}, "json");
我的警报永远不会被调用....这是一个问题,因为我想通过 django 表单清理这些数据,并且发布请求似乎没有发送到服务器(仅在生产中)。
我做错了什么?
更新:
解决方案:从 django 1.3 开始,crsf 令牌需要推送 ajax 发布请求(而不是获取)
另外,根据下面提供的链接,以下 javascript
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
// Only send the token to relative URLs i.e. locally.
xhr.setRequestHeader("X-CSRFToken",
$("#csrfmiddlewaretoken").val());
}
}
});
需要修改如下:
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
// Only send the token to relative URLs i.e. locally.
xhr.setRequestHeader("X-CSRFToken",
$('input[name="csrfmiddlewaretoken"]').val());
}
}
});
csrf 令牌在表单中呈现的方式必须在 1.25 - 1.3 之间发生变化?? 无论如何,它有效。感谢大家的帮助
【问题讨论】:
-
使用 firebug 或 webkit 的检查器查看请求发生了什么,我敢打赌那里有 500 错误。
-
实际上我得到了 403 禁止
-
...登录的用户是否正在尝试发送该 ajax 表单?
-
我还没有任何用户认证系统