无法在Django中使用AJAX POST

时间:2016-08-08 03:04:18

标签: python ajax django python-3.x

我无法在Django中执行POST ajax请求。如果我做GET请求,它工作正常。我认为它可能是一个csrf令牌问题,但我可以让它工作

我的观点:

@login_required
def add_share_points(request):
    user = request.user
    profile = request.user.profile

    if request.method == 'POST':
        value = 5.0

        # Premia o usuário ao compartilhar conteúdo
        VirtualCurrencyTransaction.objects.create(
            user=request.user,
            reason=2,
            description='Você completou seu perfil',
            value=value
        )

    return "ok"

我的AJAX请求:

$('.my-button').on('click', function(e) {
    e.preventDefault();
    var pointsCount = $(this).hasClass('homepage-facebook-share') ? 3 : 2;
    $.ajax({
        type:"POST",
        url: "/add_share_points",
        data: {
            points: pointsCount,
        }
    }).done(function() {
        alert('Posting completed.');
    }).fail(function(){
        alert('Error while posting.');
    });
});

在我的脚本中,我也有这样的设置:

function csrfSafeMethod(method) {
    return (/^(GET|HEAD|OPTIONS|TRACE)$/).test(method);
}

$.ajaxSetup({
    crossDomain: false,
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type)) {
            xhr.setRequestHeader('X-CSRFToken', CSRF_TOKEN);
        }
    }
});

我的代码出了什么问题?它给了我一个500错误代码,但在日志中没有进一步的解释。

1 个答案:

答案 0 :(得分:2)

我会指出要纠正的几个方面,有些方法只是以django方式进行,而不是问题。

在您的视图中

 return HttpResponse(
            json.dumps({'result': 'ok',}),
            content_type="application/json"
        )

在你的ajax中

url: "/add_share_points",

应该是:

url : {% url '<name in url.py>' %},

你需要添加(到数据对象):

 csrfmiddlewaretoken: '{{ csrf_token }}'

在ajax请求中,在数据后插入:

// handle a successful response
success : function(json) {
     if (json.result=== 'ok'){
         console.log('It works!');
     }else{
         console.log('Something wrong with response');
     }
// handle a non-successful response
error : function(xhr,errmsg,err) {
    console.log(err);
}

在您的脚本中

而不是CSRF_TOKEN使用'{{ csrf_token }}'

  

请使用我的建议并给我反馈,我会更新答案。 csfrtoken这两个可能是您遇到的问题。如果你把Django放在调试模式下,它将更容易找到。

我的建议

创建一个form,其中包含您需要发布的内容,以便在验证过程中获得一些功能。