我无法在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错误代码,但在日志中没有进一步的解释。
答案 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,其中包含您需要发布的内容,以便在验证过程中获得一些功能。