2013-10-08 82 views
1

Ajax代码不能发送请求到服务器,但是当我定期向同一个url请求http请求时,它可以工作。我试图将网址字段替换为“http://”网址,仍然无法工作。任何人有想法?jquery函数不能发送Ajax请求到Django服务器

Environment: 

django 1.5.4; 
python 2.7.4; 
jquery 2.0.3; 

的test.html

<html> 
    <head> 
      <title></title> 
      <script type='text/javascript' src="http://code.jquery.com/jquery-2.0.3.min.js"></script> 
      <script type="text/javascript"> 
      $(document).ready(function() { 
        $("#button").click(function(){ 
          $.ajax({ 
            type : "POST", 
            url : "{% url 'getlist' %}", 
            data : { 
              msg : 'abcd' 
            }, 
          }).done(function(data){ 
            alert(data.message); 
          }); 
        }); 
      });  
      </script> 
    </head> 
    <body> 
      <input id="button" type="button" value="Get message from server!"> 
      {% if resource_list %} 
      <ul> 
        {% for resource in resource_list %} 
        <li><a href="{{ resource.url }}">{{ resource.name }}</a></li> 
        {% endfor %} 
      </ul> 
      {% else %} 
      <p>No Resources</p> 
      {% endif %} 
    </body> 

view.py

def getList(request): 
    print "Reach getLists" 
    if request.is_ajax(): 
      try: 
        msg = request.POST['msg'] 
      except: 
        return HttpResponse(simplejson.dumps({'message':'Error From Server'})) 
      return HttpResponse(simplejson.dumps({'message':msg})) 
    else: 
      return HttpResponse(simplejson.dumps({'message':'Not an ajax request'})) 

urls.py

url(r'^test$', views.test), 
url(r'^getlist/$', views.getList, name='getlist'), 

====================================更新===== ================================ 错误信息

Forbidden (403) 

CSRF验证失败。请求中止。 帮助 给出失败的原因: CSRF令牌丢失或不正确。

==============================已解决=============== ===================
解决方案:在JavaScript文件的数据字段中添加“csrfmiddlewaretoken:'{{csrf_token}}”后,它就起作用了。原因是django启用了CSRF保护。

==============================谢谢=============== =====================
感谢@ dkp2442和@Christian Ternus的帮助,特别是@ dkp2442。

+1

你得到什么错误?出现“达到getLists”消息吗?你可以在你的Javascript和/或Django控制台中看到任何东西吗? –

+1

您是否在呈现的模板上查看过源代码以确保“{%url”getlist'%}'正常工作? – dpk2442

+0

@Christian Ternus单击按钮时,“Reach getLists”消息无法显示,但在浏览器的http请求访问时显示。以前,我添加了一个警报来显示错误信息,并且信息是403:undefined。 – user2859885

回答

2

那么我创建了一个gist,但它以某种方式保密(我可以编辑?? ??哈哈)。无论如何,你需要在你的文章中加入csrftoken。下面是我的回答:

function getCookie(name) { 
     var cookieValue = null; 
     if (document.cookie && document.cookie != '') { 
      var cookies = document.cookie.split(';'); 
      for (var i = 0; i < cookies.length; i++) { 
       var cookie = jQuery.trim(cookies[i]); 
       // Does this cookie string begin with the name we want? 
       if (cookie.substring(0, name.length + 1) == (name + '=')) { 
        cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
        break; 
       } 
      } 
     } 
     return cookieValue; 
    } 

您可以使用您的任何帖子说的getCookie功能,只包括它像这样:

 $(document).ready(function() { 
     $("#button").click(function(){ 
      $.ajax({ 
       type : "POST", 
       url : "{% url 'getlist' %}", 
       data : { 
        msg : 'abcd', 
        csrfmiddlewaretoken: getCookie('csrftoken') 
       } 
      }).done(function(data){ 
       alert(data.message); 
      }); 
     }); 
    });