Djangopost不工作:

我正在使用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表单清理这些数据,并且post请求似乎没有进入服务器(仅在生产中)。

我究竟做错了什么?

更新:

解决方案:从django 1.3开始,crsf令牌需要被推送ajax post request(not get)

另外,根据下面提供的链接,以下javascript

 $.ajaxSetup({ beforeSend: function(xhr, settings) { if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { // Only send the token to relative URLs ie 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 ie locally. xhr.setRequestHeader("X-CSRFToken", $('input[name="csrfmiddlewaretoken"]').val()); } } }); 

csrf令牌在表单中呈现的方式必须在1.25 – 1.3之间变化 无论如何,它都有效。 感谢大家的帮助

你能直接从生产服务器访问你的javascript文件吗? 你在制作中使用哪个Django版本? 如果您在生产中使用1.2.5+,则需要在AJAX后期操作期间将csrf标记推送到服务器。

请参阅1.2.5和CSRF中 的发行说明

要检查您的Django版本:

 import django django.get_version() 

在生产站点或生产服务器中的shell上打印上述内容,同时确保使用正确的Python路径。

您的代码看起来很好,粗略一瞥,但我会向您展示我的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发出请求成功的信号。