我正在使用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之间变化 无论如何,它都有效。感谢大家的帮助
答案 0 :(得分:1)
您的代码看起来很好,粗略一瞥,但我会向您展示我的ajax表单处理代码的示例,希望它有助于找出正在发生的错误。虽然@dmitry评论的应该是你的第一个调试步骤 - 使用firebug或者检查器来查看ajax调用是否返回错误。
// js (jQuery 1.5)
$(form).submit(function(event) {
event.preventDefault();
$.post(post_url, $(form).serialize())
.success(function(data, status, jqxhr) {
if (data.success) { // form was valid
$(form)
// other irrelevant code
.siblings('span')
.removeClass('error')
.html('Form Successful');
} else { // form was invalid
$(form).siblings('span').addClass('error').html('Error Occurred');
}
})
.error(function(jqxhr, status, error) { // server error
$(form).siblings('span').addClass('error').html("Error: " + error);
});
});
// django
class AjaxFormView(FormView):
def ajax_response(self, context, success=True):
html = render_to_string(self.template_name, context)
response = simplejson.dumps({'success': success, 'html': html})
return HttpResponse(response, content_type="application/json", mimetype='application/json')
// view deriving from AjaxFormView
def form_valid(self, form):
registration = form.save()
if self.request.is_ajax():
context = {'competition': registration.competition }
return self.ajax_response(context, success=True)
return HttpResponseRedirect(registration.competition.get_absolute_url())
def form_invalid(self, form):
if self.request.is_ajax():
context = { 'errors': 'Error Occurred'}
return self.ajax_response(context, success=False)
return render_to_response(self.template_name, {'errors':form.errors})
实际上,将上述内容与代码进行比较,可能需要在django视图中设置content_type,以便jQuery可以理解和处理响应。请注意,上面是使用基于django 1.3类的视图,但逻辑应该是熟悉的。我使用context.success
来表示表单处理是通过还是失败 - 因为任何类型的有效响应(json)都会向jQuery.post
发出请求成功的信号。
答案 1 :(得分:1)
您可以直接从生产服务器访问您的javascript文件吗?你在制作中使用哪个Django版本?如果您在生产中使用1.2.5+,则需要在AJAX后期操作期间将csrf标记推送到服务器。
请参阅the release notes in 1.2.5和CSRF
检查您的Django版本:
import django
django.get_version()
在您的生产站点或生产服务器的shell中打印以上内容,同时确保使用正确的Python路径。