会话技术
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