2011-04-17 124 views
1

我正在使用Django 1.2.3开发一个站点。我的ajax get请求可以正常工作,但是post请求以开发模式(127.0.0.1:8000)工作,但当我使用apache + nginx将网站推入生产环境时不能工作。Django的帖子不能正常工作:

下面是一个例子

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"); 

我的警报不会被调用.. ..这是一个问题,因为e我想通过django表单清理这些数据,并且发布的请求似乎没有将其发送到服务器(仅在生产环境中)。

我到底做错了什么?

更新:

溶液:CRSF令牌需要被推动AJAX POST请求(未获取)作为django的1.3

也,每链路在下面提供,下面的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 t奥肯得到的形式必须在1.25 - 1.3之间变化?不管怎么说,它都可以工作。感谢大家的全力帮助

+0

使用萤火虫或webkit的检查员来查看请求发生了什么,我打赌那里有500错误。 – 2011-04-17 21:40:09

+0

其实我得到403禁止 – josephmisiti 2011-04-17 23:02:22

+0

...是用户登录,试图发送该Ajax形式? – 2011-04-18 00:30:55

回答

1

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

the release notes in 1.2.5CSRF

要检查你的Django版本:

import django 
django.get_version() 

打印在生产站点或从生产服务器的外壳,同时确保你使用了正确的Python的路径上。

+0

$ python -c“import django; print django.get_version()” 1.3 – josephmisiti 2011-04-18 01:22:30

+0

没问题,所以解决方案实际上是CSRF令牌没有被ajax请求推送。我必须做的一个修改如下(从1.2.5发行说明中提供的链接中获取) – josephmisiti 2011-04-18 01:36:58

+0

看起来您在生产中使用1.3在开发计算机上创建一个新的virtualenv并安装django 1.3。并测试后的ajax操作,您可能需要从我上面发布的CSRF链接中阅读更多内容。 – 2011-04-18 01:37:15

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请求已成功。

+0

添加content_type =“application/json”,mimetype ='application/json'给我的HttResponse,没有骰子 – josephmisiti 2011-04-17 23:04:56