关于channels的self.scope
消费者在初始化时接收到连接的scope,其中包含了在 Django 视图中可以找到的关于request对象的许多信息。 它以消费者方法内部的 self.scope 来使用。
今天在做consumer学习的时候发现:
当我在登录视图函数使用login(request,request.user)
之后,channels的consumer的scope
中才能获取到user信息。
user信息的获取流程:
login的时候会生成一个SESSION_KEY,而根据此request.session[SESSION_KEY]里保存在着用户id信息,
实际上这个SESSION_KEY
就是键值对的key
session = {
随机字符串1:{
用户1的相关信息
}
随机字符串2:{
用户2的相关信息
}
}
如图login的源码里,request.session[SESSION_KEY]保存了用户的id。
引申:session原理
cookie是保存在用户浏览器端的键值对
session是保存在服务器端的键值对
更详细的解说:
https://www.cnblogs.com/zhaof/p/6281468.html
主要是login做了session保存用户信息这件事。
那么在channels的中间件是怎么获取user的呢
一目了然:
一样是利用session来获取到了SESSION_KEY,而SESSION_KEY又对应着userid,之后通过userid来获取user信息,并存入self.scope['user']
中
ps:浏览器保存了SESSION_KEY,但是内容有保存在数据库里哦,这样的话如果曾经在这个浏览器页登录过,那么之后再访问,就立马让django知道原来这是上次的它啊,我还记录了他的id号呢!这样就算不用login(),request/scope得到user信息。