在发送请求时获取值的位置?

时间:2014-09-23 11:03:02

标签: javascript python ajax django

请帮助解决问题。

HTML:

<div class="modal fade" id="commonModal" tabindex="-1" role="dialog" aria-labelledby="commonModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>

                <h4 class="modal-title" id="commonModalLabel">Modal title</h4>
            </div>

            <div class="modal-body">
                ...
            </div>

            <div class="modal-footer">
                <button type="button" class="btn btn-default but_cancel" data-dismiss="modal">Отменить</button>
                <button type="button" class="btn btn-primary but_ok" data-dismiss="modal">Ok</button>
            </div>
        </div>
    </div>
</div>

我按如下方式发送ajax请求:

$('#commonModalLabel').text('Удалить профиль?');
$('#commonModal .modal-body').html('Возможность восстановить профиль будет доступна в течение двух недель. Для восстановления нужно отправить <a href="mailto:prozaik81-2@yandex.ru">администратору</a> ресурса письмо с почтового адреса, который был указан в профиле.');
$('#commonModal').modal('show');    

$('#commonModal .but_ok').on('click', function(){
    console.log('ok');

    $.ajax({
        url: "/accounts/delete_profile/",
        type: 'POST',
        dataType:"json",
        data: {},
        success: function(data) {
            if(data.result == true){
                $('#mySmallModalLabel').text('Профиль удалён');
                $('#infoModal').modal('show');
            }
        }
    });             
});

views.py:

def delete_profile(request):
    result = False

    if request.method == "POST" and request.is_ajax():
        username = request.POST.get('username', '')     

        try:
            entry = User.objects.get(username=username) 
            entry.is_active = 0
            entry.save()
        except:
            pass
        else:
            result = True

    data = {
        'result': result,       
    }

    return HttpResponse(json.dumps(data), content_type='application/json')      

问题是在日志中出现以下错误消息:

  

禁止访问(CSRF令牌丢失或不正确。):   /账户/ delete_profile /

如果是表单,我会按如下方式发送令牌:

{% csrf_token %}

但在我的情况下没有形式(!)。请告诉我在哪里获得令牌以及如何发送

2 个答案:

答案 0 :(得分:1)

将其放入您的AJAX请求中。

    beforeSend: function(xhr, settings) {
        xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
    },

有时它在某些浏览器中不起作用(在我的情况下是chrome),因此您可以将这些添加到您要发送到的数据中查看:

data['csrfmiddlewaretoken'] = $.csrf_token; 

$.csrf_token对我来说是一个全局对象,我将令牌直接打印到模板:

<script type="text/javascript">
    $.csrf_token = '{{ csrf_token }}';
</script>

答案 1 :(得分:0)

您的问题在django docs

中有解释

请注意,如果没有呈现任何表单,django可能不会发送csrf令牌,则必须使用ensure_csrf装饰器