Django框架中的 request.user的通俗解释

我今天看这个东西,感觉很难理解,凭什么在我调用request.user他就知道是哪个对象呢。
刚开始我怀疑是login的问题。
login(),该函数接受一个 HttpRequest 对象和一个 User 对象作为参数并使用Django的会话( session )框架把用户的ID保存在该会话中。当我把这个东西注释后,发现自己居然还能找到对象,这就有点恐怖了,难道不是因为他????
好吧,我是傻子,浏览器里面cookie中存储的sessionid并没有删掉,这不删除login有没有都没有影响啊。于是再把他删除掉后,nice,找不到了(有点小兴奋)。这已经可以确定,是因为login()了。
既然知道了原因,不如我们用发散的思维去理解下他。
当我们调用login(),我们在服务器端的session中保存了所传参数user对象的唯一标识(以前不明白为啥存这个东西,现在知道了,好查找到对象),并且将sessionid存储到浏览器中的cookie里,当浏览器访问服务器端的时候,会将sessionid载着request传进来,传到服务器端后,request.session和自己的区域连接起来,django发现request.session所对应的区域里面居然有个user对象唯一标识?那我帮你直接找到吧,并把找到的对象直接赋值给request.user。

只要你login了,那么你的浏览器里面一定有这个对象的印记,当你发出请求后,服务器也可以通过这个对象的印记找到这个对象了。
还有user.is_authenticated(),当你login后,他就是真,没login,他就是假。
我们可能会感觉很没必要,request.userj就已经是获得的login()后的对象了,明明必须login后才能通过request.user获得到对象,那为什么不能通过request.user对象是否存在来判断是否登录呢?我查看了很多资料,写的都很模糊,有没有这种情况,服务器端只保留你3天登录权限,三天后自动帮你logout,但是在浏览器的cookie中,sessionid却保留了5天,当你第四天访问服务器的时候,明明你已经被服务器自动logout了,但是你的sessionid还在,还是能找到自己对应的对象,对象存在,不代表你登陆过了。
如果你使用is_authenticated()判断用户是否登录,那么意味着你采用了django的auth系统,
那么你的登陆最好使用django.contrib.auth中的login方法,
该方法会为将user_id以及user_backend放入session中存储,
.is_authenticated()通过判断session中是否有user_id 以及user_backend 来判断用户是否登陆。
如果,采用自己的登陆方法,那么有可能没将user_id 或者user_backend 放入session中保存。
所以你的user被django认为没有登录,虽然你已经登陆了。
最好的办法是利用django自己的登陆方法,结合该方法,判断用户是否登陆,从而决定用户的行为。

我们再梳理一遍,当我们login后,会将唯一标识符存储到session空间里,当下次访问的时候,django先将sessionid对应的空间交给request.session,然后发现request.session里面有唯一标识符,他就会将这个唯一标识符作为条件,去user表中查找到这个对象(为啥去user表??因为login就是和user表服务的,如果你没重写user表的话,他就会去找auth里面的user,如果重写了,记得改标识,改完他就去找继承的user表了),并且将这个对象(即查找结果)赋值给request.user(有没有感觉到,这是不是和我们的,比如说:student.objects.get(id=5)很像),也就是说,request.user就代表了数据库中的一条数据,当我们的user对象修改时,如:request.user.name=‘xiaoming’,再request.user.save()后,数据库中的数据也会相应修改。

这东西也别理解了,记住就行,源码不是咱学习的根本。
ps:纯粹个人理解,感觉狗屁不通的勿喷=-=。

  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值