我有一个充当API的django服务器(即侦听请求并仅返回数据),我希望此API只能由经过身份验证的用户访问。 我读到了django身份验证系统,并尝试根据文档(https://docs.djangoproject.com/en/2.0/topics/auth/default/)实现它。
我写了一个小网页只是为了测试身份验证 - 登录成功(服务器能够验证并登录用户),但是当尝试访问受限制的视图时,我没有访问权限,并且request.user已收到是一个AnonymousUser而不是登录用户。
我正在使用Python 3.6.5和Django 2.0.4
服务器代码:
@csrf_exempt
def dologin(request):
username = request.POST.get('username')
password = request.POST.get('password')
if not username or not password:
return HttpResponse('missing username or password', status=400)
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return HttpResponse(user)
else:
return HttpResponse('bad credentials', status=422)
def dologout(request):
logout(request)
return HttpResponse('success')
@login_required()
def testAccess(request):
return HttpResponse('ok')
def checkUser(request):
u = "anonymous" if not request.user.is_authenticated else request.user.username
return HttpResponse(u)
客户代码:
<label>username:</label>
<input type="text" id="uin"/>
<label>username:</label>
<input type="text" id="pin"/>
<button id="inbtn">login</button>
<button id="outbtn">logout</button>
<button id="test">test access</button>
<button id="check">check user</button>
<div id="res"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js" type="text/javascript"></script>
<script>
$("#inbtn").click(function(){
u = $("#uin").val();
p = $("#pin").val();
d = {username: u, password: p};
$.post("http://10.0.0.9:8000/login/", d, function(data){
$("#res").html(data);
}).fail(function(xhr, status, error){
$("#res").html(xhr.responseText + " - " + xhr.status);
});
});
$("#outbtn").click(function(){
$.get("http://10.0.0.9:8000/logout/", function(data){
$("#res").html(data);
}).fail(function(xhr, status, error){
$("#res").html(xhr.responseText + " - " + xhr.status);
});
});
$("#test").click(function(){
$.get("http://10.0.0.9:8000/testaccess/", function(data){
$("#res").html(data);
}).fail(function(xhr, status, error){
$("#res").html(xhr.responseText + " - " + xhr.status);
});
});
$("#check").click(function(){
$.get("http://10.0.0.9:8000/checkuser/", function(data){
$("#res").html(data);
}).fail(function(xhr, status, error){
$("#res").html(xhr.responseText + " - " + xhr.status);
});
});
</script>
(我在本地运行所有内容,这就是为什么我使用10.0.0.9这是我的电脑的ip)
正如我之前写的 - 在成功登录后,单击“测试访问”会产生404响应,单击“检查用户”将返回“匿名”(通过调试服务器,我知道用户确实是AnonymousUser)
答案 0 :(得分:0)
我怀疑你的问题与会话数据有关。
在身份验证和登录后,用户设置在一个django session内。 HTTP cookie(默认名称为sessionid
)将使用会话编号设置。
对于每个subsecuent请求,您还需要将sessionid
传递给服务器,以便服务器可以识别此新请求所属的用户。
您应该了解如何在登录后获取sessionid
Cookie,以及如何将相同的sessionid
与新请求一起发送。