2014-09-22 6 views
0

Я получаю ошибку Ошибка CSRF не удалась. Запрос прерван.Не удалось выполнить проверку CSRF. Запрос прерван. in django ajax post

У меня есть два файла, один post.html и post_reply.html

я получаю post_reply файл HTML в post.html с помощью Ajax

вид является

def Display_post(request): 
    if request.method=="GET": 
     post = Post.objects.all() 
     #print post 
     data = [] 
     for pos in post: 
      rep = Comment.objects.filter(post=post) 

      html = render_to_string('home/post_reply.html',{"post":post, "rep":rep}) 
      return HttpResponse(html, mimetype="application/json") 

Так что теперь моя форма ответа находится в файле post_reply, который получает post.html Теперь я получаю подтверждение CSRF. Ошибка я @csrf_exempt еще ее не работает

Post.html

function save_reply(s) 
        { 
         //alert("hello"); 
         //alert(s); 
         $.djangocsrf("enable"); 

                var reply = $(".rep1").val(); 

                var form = $("#"+s).parent(); 

                //alert(reply); 
                csr = $("#"+s).prev().val(); 
                alert(csr); 
                data = { 
                  reply: reply, 


                 }; 
                $.ajax({ 
                  url: "/home/reply_save/"+s, 
                  type: "POST", 
                  data: form.serialize(), 
                  success: function (response) { 
                    alert("hello"); 

                      }, 
                   error: function() { 

                       } 
                 }); 
        } 

post_reply.html

{% for postone in post %} 
    <div class="testmain span11"> 
     <div class="span1 test1"><img src="/media/{{postone.image}}" width="70" height="70" class="img-circle img-responsive"/></div> 
     <div class="span8 second"> 
      <div class="test1 span5"><a><strong>{{postone.user}}</strong></a></div> 
      <br/>{{postone.time}}<br/><br/> 
      <div class="test1 span7">{{postone.post}}</div> 
      <div class="test span8"><img src="/media/{{postone.image}}" width="300" height="300"/></div> 
      <div class="span8" style="margin-bottom:2%;"><a class="replytopost" style="margin-left:-4%;" onclick='tog({{postone.pk}})'>Reply<span class="badge">{{postone.number_of_reply}}</span></a><input class="id5" type="hidden" value='{{postone.pk }}'></div> 
      <div id='{{postone.pk}}' class="hid"> 


<form method="post" action="." enctype="multipart/form-data" class="horizontal-form" role="form" id='{{postone.pk}}' style=""> {% csrf_token %} 
      <input type="text" name="lname" class="rep1" style="border-radius: 0px; "><input type="submit" onclick="save_reply({{postone.pk}})" class="btn btn-info replysave" id='{{postone.pk}}' value="Reply" style="border-radius: 0px; margin-bottom: 10px;"/> 
     </form> 


      <br/>{% for rep1 in rep %} 
      <div class="span1 test1"><img src="/media/{{postone.image}}" class="img-circle img-responsive" width="50" height="50"></div> 
      <div class="span6 third"> 
       <div class="test1 span5"><a><strong>{{postone.user}}</strong></a></div> 
       <br/> 
       <div class="test1 span7">{{postone.post}}</div><br/> 
       <div class="test1 span6" style="margin-top:3%; margin-left:10%; font-size:0.9em;">{% load humanize %} {{postone.time|naturaltime}}</div> 
      </div> 
      {% endfor %} 
      </div> 
     </div> 
    </div> 
    {% endfor %} 

ответ

2

Следовать django documentation:

добавить код яваскрипта на свои страницы, чтобы отправить значение CSRF с запросами ajax:

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)); 
} 
$.ajaxSetup({ 
    beforeSend: function(xhr, settings) { 
     if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 
      xhr.setRequestHeader("X-CSRFToken", csrftoken); 
     } 
    } 
}); 
-1

Вы можете использовать промежуточное программное обеспечение, чтобы избежать проверки csrf для всех сообщений ajax, использовать его до промежуточного программного обеспечения csrf.

class DisableCSRF(object): 
    def process_request(self, request): 
     if request.is_ajax(): 
      setattr(request, '_dont_enforce_csrf_checks', True) 

Да, это быстрое и грязное решение, но я использую его для моего бэкапа отдыха, который не использует файлы cookie.

+3

Лучше не делайте этого. csrf - это не просто то, что вы чувствуете боль, оно защищает проект от [подделки подделок] (http://www.squarefree.com/securitytips/web-developers.html#CSRF) – stalk

+0

Отключение защиты csrf для ajax calls открывает вашу службу для различных атак: https://en.wikipedia.org/wiki/Cross-site_request_forgery. – DimmuR

Смежные вопросы