2012-10-23 131 views
10

使用django 1.4即时消息403当我尝试从我的javascript做一个职位做我的Django服务器。尽管问题只与帖子有关,但我的工作正常。也试过@csrf_exempt没有运气django ajax post 403禁止

更新:我现在可以发布,我添加了{% csrf_token %},但帖子响应是空的,虽然GET来的正确,任何想法?

我Django的看法:

@csrf_protect 
def edit_city(request,username): 
    conditions = dict() 

    #if request.is_ajax(): 
    if request.method == 'GET': 
     conditions = request.method 

    elif request.method == 'POST': 
     print "TIPO" , request.GET.get('type','')  
     #based on http://stackoverflow.com/a/3634778/977622  
     for filter_key, form_key in (('type', 'type'), ('city', 'city'), ('pois', 'pois'), ('poisdelete', 'poisdelete'), ('kmz', 'kmz'), ('kmzdelete', 'kmzdelete'), ('limits', 'limits'), ('limitsdelete', 'limitsdelete'), ('area_name', 'area_name'), ('action', 'action')): 
      value = request.GET.get(form_key, None) 
      if value: 
       conditions[filter_key] = value 
       print filter_key , conditions[filter_key] 

     #Test.objects.filter(**conditions) 
    city_json = json.dumps(conditions) 

    return HttpResponse(city_json, mimetype='application/json') 

这里是我的javascript代码:

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; 
} 
var csrftoken = getCookie('csrftoken'); 

function csrfSafeMethod(method) { 
    // these HTTP methods do not require CSRF protection 
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
} 
function sameOrigin(url) { 
    // test that a given url is a same-origin URL 
    // url could be relative or scheme relative or absolute 
    var host = document.location.host; // host + port 
    var protocol = document.location.protocol; 
    var sr_origin = '//' + host; 
    var origin = protocol + sr_origin; 
    // Allow absolute or scheme relative URLs to same origin 
    return (url == origin || url.slice(0, origin.length + 1) == origin + '/') || 
     (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') || 
     // or any other URL that isn't scheme relative or absolute i.e relative. 
     !(/^(\/\/|http:|https:).*/.test(url)); 
} 
$.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()); 
    } 
} 
}); 

$.post(url,{ type : type , city: cityStr, pois: poisStr, poisdelete: poisDeleteStr, kmz: kmzStr,kmzdelete : kmzDeleteStr,limits : limitsStr, area_nameStr : area_nameStr , limitsdelete : limitsDeleteStr},function(data,status){ 
        alert("Data: " + data + "\nStatus: " + status); 
        console.log("newdata" + data.area_name) 
       }); 

我还从网站上试着与没有运气:

$.ajaxSetup({ 
    beforeSend: function(xhr, settings) { 
     if (!csrfSafeMethod(settings.type) && sameOrigin(settings.url)) { 
      // Send the token to same-origin, relative URLs only. 
      // Send the token only if the method warrants CSRF protection 
      // Using the CSRFToken value acquired earlier 
      xhr.setRequestHeader("X-CSRFToken", csrftoken); 
     } 
    } 
}); 

我失去了什么?

+1

您是否设置了DEBUG = True?转到Chrome开发工具 - >网络,然后点击失败的请求。您在预览或响应标签中收到什么信息? –

+0

我得到一个“CSRF验证失败,请求中止。” – psychok7

+0

奇怪现在我的帖子反应来了EMPTY,任何想法为什么?获得仍然正常工作 – psychok7

回答

3

得到它在我的模板添加{% csrf_token %}某处形式中工作

+0

csrf_token是一个反跨站点请求伪造(http://en.wikipedia.org/wiki/Cross-site_request_forgery)令牌,并且是必需的,因为'django.middleware.csrf.CsrfViewMiddleware'是在settings.py的MIDDLEWARE_CLASSES部分中定义的。 –

24

你其实可以与您的数据一起传递{csrfmiddlewaretoken:“{{csrf_token}}},它的工作原理所有的时间

+4

令牌的名称应该是“csrfmiddlewaretoken”,而不是“csrftoken”。 (Django 1.4) –

6

在我的情况下,我有一个模板,我不想要<form></form>元素。但我仍然想使用jQuery进行AJAX POST请求。

由于CSRF cookie为空,即使我遵循django文档(https://docs.djangoproject.com/en/1.5/ref/contrib/csrf/),我也得到403错误。解决方案是在同一页面,提及ensure_csrf_cookie修饰器。

我CSRF饼干没有得到设定,当我加入这个在我views.py的顶部:

from django.views.decorators.csrf import ensure_csrf_cookie 
@ensure_csrf_cookie 

而且,请注意,在这种情况下,你不需要的DOM元素在您的标记/模板:{% csrf_token %}

+0

谢谢!我必须在我的类定义之前使用以下内容,因为我使用的是基于类的视图:@method_decorator(ensure_csrf_cookie,name ='update') – nbeuchat