【Django】用户认证 Auth cookie session

以下所有均基于菜鸟教程进行整理:

Auth模块 Django 用户认证(Auth)组件

创建用户:

  • create():创建一个普通用户,密码是明文的。
  • create_user():创建一个普通用户,密码是密文的。
  • create_superuser():创建一个超级用户,密码是密文的,要多传一个邮箱 email 参数。

User是Django自带的用户模型,可以自行对它拓展或重写替代

from django.contrib.auth.models import User 
User.objects.create(username='runboo',password='123')
User.objects.create_user(username='runbooo',password='123')
User.objects.create_superuser(username='runboooo',password='123',email='runboo@163.com')

验证用户:

from django.contrib import auth
# 如果验证成功,就返回用户对象,反之,返回 None。
user_obj = auth.authenticate(username=username, password=password)
print(user_obj.username)

用户登录:
也就是给验证成功的用户加 session(给浏览器返回sessionid),将 request.user 赋值为用户对象。

from django.contrib import auth
user_obj = auth.authenticate(username=username, password=password)
if user_obj:
	auth.login(request, user_obj)

注销用户:
即清空 session 信息,将 request.user 赋值为匿名用户。

from django.contrib import auth
ppp = auth.logout(request)
print(ppp) # None

登陆装饰器:
如果用户是未登录的状态,就给用户返回登录页面。从哪个页面访问,登录成功后就返回哪个页面。

from django.contrib.auth.decorators import login_required 
@login_required
def index(request):
  return HttpResponse("index页面。。。")

Cookies

Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。
一个 Web 服务器可以分配一个唯一的 session 会话 ID 作为每个 Web 客户端的 cookie,对于客户端的后续请求可以使用接收到的 cookie 来识别。
在这里插入图片描述

设置 cookie:

rep.set_cookie(key,value,...) 
rep.set_signed_cookie(key,value,salt='加密盐',...)

#例子:用户登录验证完后,返回response
rep.set_cookie("is_login", True)
return rep

获取 cookie:

request.COOKIES.get(key)

#例子:用户请求页面时,校验是否登录
request.COOKIES.get('is_login')

删除 cookie:

rep =HttpResponse || render || redirect 
rep.delete_cookie(key)

#例子:用户退出登录时,删除cookies
rep.delete_cookie("is_login")

Session(保存在服务端的键值对)

cookie 弥补了 http 无状态的不足,让服务器知道来的人是"谁",但是 cookie 以文本的形式保存在浏览器端,安全性较差,且最大只支持 4096 字节,所以只通过 cookie 识别不同的用户,然后,在对应的 session 里保存私密的信息以及超过 4096 字节的文本。

在Web开发中,使用 session 来完成会话跟踪,session 底层依赖 Cookie 技术。
服务器在运行时可以为每一个用户的浏览器创建一个其独享的 session 对象,由于 session 为用户浏览器独享,所以用户在访问服务器的 web 资源时,可以把各自的数据放在各自的 session 中,当用户再去访问该服务器中的其它 web 资源时,其它 web 资源再从用户各自的 session 中取出数据为用户服务。
在这里插入图片描述
工作原理

  1. 浏览器第一次请求获取登录页面 login。
  2. 浏览器输入账号密码第二次请求,若输入正确,服务器响应浏览器一个 index 页面和一个键为 sessionid,值为随机字符串的cookie,即 set_cookie (“sessionid”,随机字符串)。
  3. 服务器内部在 django.session 表中记录一条数据。django.session 表中有三个字段。
    • session_key:存的是随机字符串,即响应给浏览器的 cookie 的 sessionid 键对应的值。
    • session_data:存的是用户的信息,即多个 request.session[“key”]=value,且是密文。
    • expire_date:存的是该条记录的过期时间(默认14天)
  4. 浏览器第三次请求其他资源时,携带 cookie:{sessionid:随机字符串},服务器从 django.session表中根据该随机字符串取出该用户的数据,供其使用(即保存状态)。
    django.session 表中保存的是浏览器的信息,而不是每一个用户的信息。 因此, 同一浏览器多个用户请求只保存一条记录(后面覆盖前面),多个浏览器请求才保存多条记录。

session 设置:

request.session["key"] = value

#例子:用户登录时直接写就可以,不用写生成随机字符串或者存入数据库,django自动做好(我的理解)
#返回给客户端的cookie的key默认为sessionid
request.session['is_login'] = True
request.session['user1'] = username

执行步骤:

  1. 生成随机字符串
  2. 把随机字符串和设置的键值对保存到 django_session 表的 session_key 和 session_data 里
  3. 设置 cookie:set_cookie(“sessionid”,随机字符串) 响应给浏览器

session 获取:

request.session.get('key')

执行步骤:

  1. 从 cookie 中获取 sessionid 键的值,即随机字符串。
  2. 根据随机字符串从 django_session 表过滤出记录。
  3. 取出session_data 字段的数据。

session 删除,删除整条记录(包括 session_key、session_data、expire_date 三个字段):

request.session.flush()

删除 session_data 里的其中一组键值对:

del request.session["key"]

#例子:
del request.session["is_login"]

执行步骤:

  1. 从 cookie 中获取 sessionid 键的值,即随机字符串
  2. 根据随机字符串从 django_session 表过滤出记录
  3. 删除过滤出来的记录
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值