2015-11-04 3 views
0

У меня есть этот Аякс, как голосование по моей статье модели:Джанго AJAX должности не работает с CSRF

@csrf_exempt 
@login_required 
def like(request): 
    args = {} 
    if request.method == 'POST': 
     user = request.POST.get('user') 
     lu= request.user 
     post_id = int(request.POST.get('post_id')) 
     try: 
      liked_article = Article.objects.get(id = post_id) 
     except: 
      liked_article = None 

     if ArticleLike.objects.filter(liker=lu.id, article=post_id).exists(): 

      liked_article.likes -=1 
      liked_article.save() 
      ArticleLike.objects.filter(article=post_id, liker=lu.id).delete() 


     else:    
      liked_article.likes +=1 
      liked_article.save() 
      newliker = ArticleLike(article=post_id, liker=lu.id) 
      newliker.save()   

    args.update(csrf(request)) 
    args['likes'] = str(liked_article.likes) 
    return render(request, 'ajax_like.html', args) 

Вот Аякс сниппает:

$(function(){ 
$('#like').click(function(){ 
     $.ajax({ 
       type: "POST", 
       url: "/article/like/", 
       data: { 
       'post_id': $(this).attr('name'), 
       'csrfmiddlewaretoken': '{{csrf_token}}' 
       }, 
       success: likeSuccess, 
       dataType: 'html' 
       }); 
    }); 

}); 
function likeSuccess(data, textStatus, jqXHR) 
{ 
    $('#like_count').html(data); 
} 

и ajax_lik.html

<p id="like_count"> 
{% if likes > 0 %} 
{{likes}} 
</p> 
{% else %} 
wow 
</i> 

{% endif%} Вид прекрасно работает с @csrf_exempt декоратором активным, но с csrf, я получаю 403 Forbidden ошибка.

Я пробовал разные настройки, но не мог понять, как решить эту проблему, поэтому я ценю вашу помощь.

ответ

0

Если вы используете декоратор @csrfexempt, то вам не нужно отправлять csrf_token. Кстати, csrf_token не должен быть частью данных POST,

data: { 
     'post_id': $(this).attr('name'), 
     'csrfmiddlewaretoken': '{{csrf_token}}' 
     } 

это должно быть в заголовке запроса в "X-CSRFToken".

Вот небольшой пример, чтобы установить пользовательские заголовки к AJAX запрос с помощью JQuery (docs here):

$.ajax({ 
     url: "/article/like/", 
     data: { post_id: $(this).attr('name') }, 
     type: "POST", 
     beforeSend: function(xhr){xhr.setRequestHeader('X-CSRFToken', "{{csrf_token}}");}, 
     success: likeSuccess, 
     dataType: 'html' 
     }); 

Вы можете увидеть документы Django для этого here

+0

Я добавил '@ csrf_exempt' как последнее средство , потому что я не мог заставить csrf работать. Не могли бы вы дать полный пример фрагмента ajax с правильным вызовом csrf? – Jand

+0

Он должен быть в данных POST, см. Ответ здесь: http://stackoverflow.com/questions/8614947/jquery-and-django-csrf-token –

+0

@ShangWang См. Там комментарии. Я рекомендую использовать его в заголовках, вот почему мой ответ. – Gocht