2012-10-23 43 views
10

sử dụng django 1.4 im nhận được một lỗi 403 khi tôi cố gắng làm một bài đăng từ javascript của tôi làm máy chủ django của tôi. tôi nhận được hoạt động tốt mặc dù vấn đề là chỉ với bài viết. cũng đã thử @csrf_exempt không có may mắndjango ajax post 403 bị cấm

CẬP NHẬT: Tôi có thể Đăng ngay bây giờ mà tôi đã thêm {% csrf_token %}, nhưng phản hồi bài đăng trống, mặc dù GET đến đúng, bất kỳ ý tưởng nào?

xem django tôi:

@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') 

đây là mã của tôi 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) 
       }); 

tôi cũng đã cố gắng từ các trang web không có may mắn:

$.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); 
     } 
    } 
}); 

gì am i thiếu ?

+1

Bạn đã đặt DEBUG = True? Truy cập Công cụ dành cho Chrome Dev -> Mạng và nhấp vào yêu cầu không thành công của bạn. Bạn nhận được thông báo gì trong tab Xem trước hoặc phản hồi? –

+0

tôi nhận được một "xác minh CSRF không thành công. Yêu cầu hủy bỏ." – psychok7

+0

lạ bây giờ bài trả lời của tôi đến EMPTY, bất kỳ ý tưởng tại sao? vẫn hoạt động tốt – psychok7

Trả lời

3

nhận nó làm việc bằng cách thêm {% csrf_token %} đâu đó trong biểu mẫu trong mẫu của tôi

+0

csrf_token là mã thông báo chống xuyên trang, yêu cầu giả mạo (http://en.wikipedia.org/wiki/Cross-site_request_forgery), và được yêu cầu vì 'django.middleware.csrf.CsrfViewMiddleware' được định nghĩa trong phần MIDDLEWARE_CLASSES trong settings.py của bạn. –

24

bạn thực sự có thể chuyển thông tin này cùng với dữ liệu của bạn {csrfmiddlewaretoken: '{{csrf_token}}'}, nó hoạt động tất cả các thời gian

+4

Tên của mã thông báo phải là "csrfmiddlewaretoken", thay vì "csrftoken". (Django 1.4) –

6

Trong trường hợp của tôi, tôi có mẫu mà tôi không muốn có phần tử <form></form>. Nhưng tôi vẫn muốn thực hiện các yêu cầu AJAX POST bằng cách sử dụng jQuery.

Tôi nhận được 403 lỗi, do cookie CSRF bị vô hiệu, ngay cả khi tôi theo tài liệu django (https://docs.djangoproject.com/en/1.5/ref/contrib/csrf/). Giải pháp nằm trong cùng một trang, đề cập đến trang trí ensure_csrf_cookie.

Cookie CSRF tôi đã nhận được thiết lập khi tôi thêm này ở đầu views.py tôi:

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

Ngoài ra, xin lưu ý rằng trong trường hợp này bạn không cần phần tử DOM trong đánh dấu của bạn/mẫu : {% csrf_token %}

+0

Cảm ơn! Tôi đã phải sử dụng sau đây trước khi định nghĩa lớp học của tôi như tôi đã sử dụng quan điểm dựa trên lớp học: @method_decorator (Ensure_csrf_cookie, name = 'update') – nbeuchat

Các vấn đề liên quan