【发布时间】:2017-09-11 02:28:06
【问题描述】:
django + ajax 403 错误的主要原因是缺少 csrf 令牌,但在我的情况下它存在并且几乎相同的 ajax 函数可以正常工作。我还将附加使用 djangorestframework 处理响应的后端视图函数。
$.ajax({
url: '/authsteptwo/',
type:'POST',
dataType: 'json',
data: { phone_number : phone_number, email : email, csrfmiddlewaretoken: "{{ csrf_token }}" },
success: function () {
// alert('succes');
setTimeout(
function()
{
alert('fine');
}, 0);
},
error : function() {
alert('fck');
}
})
查看
@api_view(['POST', ])
def auth_step_two(request):
if request.method == 'POST':
phone_number = request.data['phone_number']
email = request.data['email']
# user = request.user.UserProfile
# user.email = email
# user.phone_number = phone_number
# user.save()
else:
print("WTF")
return Response(request.data)
控制台:
Failed to load resource: the server responded with a status of 403 (FORBIDDEN)
还有其他原因会导致 403 错误吗?
编辑:我试图在页面的开始时调用 ajax 函数,然后它就起作用了。但是在点击时调用相同的函数(没有真实数据,所以它不相关)失败了 403 或者也落在了 jQuery 点击事件上。很奇怪。有什么建议吗?
编辑:哦,我发现在执行第一次 ajax 身份验证调用后实际上没有 ajax 函数起作用。我附上了第一次调用的代码,它有效,之后没有任何效果。帮助我理解为什么?
$.ajax({
url: '/authfb/',
type:'POST',
dataType: 'json',
data: {"fb_first_name": fb_first_name, "fb_last_name": fb_last_name, "fb_username": fb_username, "fb_email":fb_email, "fb_id":fb_id, "fb_link":fb_link, csrfmiddlewaretoken: "{{ csrf_token }}" },
success: function () {
// alert('succes');
setTimeout(
function()
{
$('#hide_group').hide();
$('#show_group').show();
$('.loading_white_wall').fadeOut();
$('.greeting_title_name').html(fb_first_name);
if(fb_email){
$(".email_input").prop("value", fb_email);
}
else{
$(".email_input").prop("placeholder", 'E-mail');
}
}, 1000);
},
error : function(data) {
$('#hide_group').hide();
$('#error_group').show();
$('.loading_white_wall').fadeOut();
}
})
还有处理程序的确切代码,有很多但可能有某种相关的东西,但很可能没有太多用处:
@api_view(['POST', ])
def authfb(request):
require_more_data = True
if request.method == 'POST':
first_name = request.data['fb_first_name']
last_name = request.data['fb_last_name']
fb_username = request.data['fb_username']
fb_id = int(request.data['fb_id'])
fb_link = request.data['fb_link']
username = fb_username.replace(' ', '')
print(fb_link)
print (type(fb_id))
# print(username)
password = '11442358'
user = auth.authenticate(username=username, password=password)
# print(type(username))
# print(type(password))
if user is not None:
auth.login(request, user)
username = auth.get_user(request).username
print ('logged in succesfully')
# user1 = UserProfile.user.objects.get(username=username)
# if (user1.userprofile.phone_number):
# print ("hello")
# email = auth.get_user(request).UserProfile.email
# if phone_number and email:
# require_more_data = False
else:
user = User.objects.create_user(username=username, password=password)
userprofile = UserProfile.objects.create(user=user, first_name=first_name, last_name=last_name)
user = auth.authenticate(username=username, password=password)
auth.login(request, user)
print (userprofile)
else:
print("WTF")
return Response(request.data)
【问题讨论】:
-
可能是身份验证令牌。也许您的 API 资源正在强制进行身份验证,而您遗漏了一些东西。
-
@AamirAdnan 我测试过什么都不发送,只发送令牌,但仍然存在错误。
-
我不是在谈论
csrfmiddlewaretoken我在谈论django-rest-framework以及它是如何handles the authentication -
@AamirAdnan 我明白了。不强制任何东西,不使用序列化程序或要求。就是这样,只是 ajax 调用、urls.py 行(正确)和处理所有这些东西的视图函数。奇怪的是它在同一个函数中工作,检查没有区别。
-
@AamirAdnan 唯一的问题是这个函数是 ajax 在用户通过身份验证后调用(使用 ajax request/fb),但之后所有其他 ajax 函数都可以工作
标签: javascript jquery ajax django django-rest-framework