Django-Cookie、Session与Token

会话技术

1、应用场景

服务器如何识别客户端
Http在Web开发中基本都是短连接

2、请求生命周期

从Request开始
到Response结束

3、种类

(1)Cookie

①客户端会话技术:数据储存在客户端
②键值对存储
③支持过期时间
④默认Cookie自动携带,本网站所有Cookie
⑤Cookie通常不跨域名,不跨网站

Cookie通过HttpResponse操作

①设置Cookie(使用response设置)
	response.set_cookie(key,value[,max_age=None,expires=None])
		max_age:整数,单位为秒,指定cookie过期时间
		expires:支持秒,也支持datetime或timedelta,可以是一个具体的日期
		二者设置其一
②获取Cookie(使用request获取)
	request.COOKIES.get("username")
③删除Cookie(使用response删除)
	response.delete_cookie("username")

Cookie的应用 => 登陆
1、首先有一个页面

页面中有输入框
有登陆按钮

2、完成登陆,默认进入个人中心
3、个人中心可以显示用户名

def cookieLogin(request):
    return render(request, "CookieGet/slogin.html")


def cookieDoLogin(request):
    name = request.POST.get("username")

    response = redirect(reverse("mine"))
    response.set_cookie("name", name)

    return response


def mine(request):
    name = request.COOKIES.get("name")

    if name:
        return HttpResponse(name)
    return redirect(reverse("cLogin"))

Cookie默认不支持中文

Cookie加盐(加密)
# 加盐                 key      value          盐名
res.set_signed_cookie("uid",users.first().id,"eric")
# 解盐                     key    盐名
request.get_signed_cookie("uid","eric")
(2)Session
①设置Session(使用request设置)
	request.session['userid'] = user.id
	request.session.set_expiry(86400)   # 设置过期时间
	
②获取Session
	get(key,default=None) 根据建获取会话的值
	username = request.session.get("userid")
	# username = request.session['session_name']
	
③删除session
	# 获取当前请求的session 的key
	sessionkey = request.session.session_key
	del request.session[sessionkey]
	# request.session.delete(sessionkey)

session.clear() 清除所有会话
session.flush() 删除当前的会话数据并删除会话的cookie

每个HttpRequest对象都有一个session属性,也是一个类字典对象

(3)Token

Token也是一种会话技术,它面向电脑浏览器和手机端有两种不同的方法

面向电脑浏览器:
Token相当于在models中新建一张Token表
属性:token_id
	 out_time(过期时间)
	 user(一对一关系,对应User表的用户)

在这里插入图片描述

我们在login视图函数中设置Token
def login(request):
    if request.method == "GET":
        return render(request, "login.html")
    elif request.method == "POST":
        # 登陆
        username = request.POST.get("username")
        password = request.POST.get("password")

        # 验证用户名和密码
        users = UesrModel.objects.filter(username=username, password=password)
        if users.exists():
            # 验证成功,登陆成功
            res = redirect(reverse("index"))

            # Token
            # 利用下面的自定义函数生成一个唯一的token值
            token = get_token()
            # out_time = datetime.datetime(2020,1,1)
            # 设置过期时间,服务器当前时间加上时间差
            out_time = datetime.datetime.utcnow() + datetime.timedelta(days=1)  
            # timedelta 时间差
			
			# UserToken表中获取登陆用户的信息
            u_token = UserToken.objects.filter(user_id=users.first().id).first()
            # 如果当前登陆的用户已经存在token记录,则更新token为最新数据
            if u_token:
                u_token.token = token
                u_token.out_time = out_time
            else:
                # 如果第一次登陆,创建Token
                user_token = UserToken()
                user_token.token = token
                user_token.user = users.first()
                user_token.out_time = out_time
                user_token.save()

            # 借助cookie将token存入浏览器端
            res.set_cookie("token",token,max_age=86400)

            # return JsonResponse({'token':user_token}) 
            # 这里是Token的第二种形式,移动端的返回,但是我还不会用


            # 进入到首页
            return res
        return render(request, "login.html")
        
# 生成唯一Token值
def get_token():
    token = uuid.uuid4()
    # hex转成16进制  
    return token.hex
    
# 首页
def index(request):

    # token获取
    token = request.COOKIES.get("token")
    user_token = UserToken.objects2.filter(token=token).first()

    # 如果token存在
    user = None
    if user_token:
        # 判断token是否过期
        # if user_token.out_time > datetime.datetime.utcnow():
        if user_token.out_time.timestamp() > datetime.datetime.utcnow().timestamp():   # 转换成时间戳
            # 没过期,获取用户信息
            user = user_token.user

    return render(request, "index.html",{"user":user})


# 注销
def logout(request):
    res = redirect(reverse('index'))

    # token
    # 删除Cookies中的token
    res.delete_cookie("token")
    # 删除UserToken表中的记录
    token = request.COOKIES.get("token")
    UserToken.objects.filter(token=token).delete()

    return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值