cookie与session
cookie与session
cookie与session简介
最开始的网站都不需要用户注册,所有人来访问获取到的数据都是一样的,随着互联网的发展很多网站需要指定当前用户的状态.后续我们还会学习token,jwt等各种技术
cookie
保存在客户端与用户状态相关的信息
1.以前,用户每登陆成功一次浏览器就会提醒用户是否要保存用户名和密码,保存成功之后每次浏览器客户端向服务端发送用户数据,但是单纯的记录用户名和密码安全性并不高,所以早期的cookie并不好用。
2.现在,正在使用的是每当用户成功登陆一次,服务端都会向浏览器服务端发送一个随机字符串,每一个随机字符串对应一个用户。以后再登陆客户端只需要拿该字符串和服务端进行对比即可。
3.所谓的注销登录,或者退出登录就是将客户端cookie删除
删除cookie:Httpresponse对象.delete(key)
session
保存在服务端与用户状态相关的信息
补充知识: session的工作需要依赖于cookie,浏览器有资格拒绝保存服务端发送过来的cookie数据
django操作cookie
from django.shortcuts import render,HttpResponse,redirect
return render()
return HttpResponse()
return redirect()
要想操作cookie就不能直接返回HttpResponse对象 必须先用变量接收
obj1 = render()
return obj1
obj2 = HttpResponse()
return obj2
obj3 = redirect()
return obj3
用户登录功能--基础版
一个用户的登录功能
def login_func(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'jason' and password == '123':
'''return返回该对象和返回重定向效果一样,此处返回对象是因为需要生成对象来传递cookie'''
obj = redirect('/home/')
obj.set_cookie('name', username)
return obj # 相当于 return redirect('/home/')
return render(request, 'loginPage.html')
# 编写一个装饰器
def login_auth(func_name):
def inner(request, *args, **kwargs):
if request.COOKIES.get('name'):
'''request属于*args,可以单独拿出来,传的时候如果只传了request首先会被形参request接收'''
res = func_name(request, *args, **kwargs)
return res
return redirect('/login/')
return inner
@login_auth
def home_func(request):
return HttpResponse('home页面 只有登录的用户才可以查看')
上面的代码只解决了:我们不管是从哪个页面跳转过来的,登录过后我们只能跳转到/home/页面,这并不符合日常逻辑。我们采用在路由的?后面添加字符串的方式来解决该问题:
用户登录功能--进阶版
用户没有登录之前就想访问某个网站输入用户名密码之后就应该调回该网站
def login_func(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'jason' and password == '123':
target_path = request.GET.get('next')
if target_path:
obj = redirect(target_path)
else:
obj = redirect('/home/')
obj.set_cookie('name', username)
return obj
return render(request, 'loginPage.html')
def login_auth(func_name):
def inner(request, *args, **kwargs):
# print(request.path) # 只获取用户输入的路由信息
# print(request.path_info) # 只获取用户输入的路由信息
'''request.path和request.path_info都能拿到请求页面的路由,这样我们就能记录下是哪个页面想服务端发送了请求'''
target_path = request.path_info
# print(request.get_full_path()) # 获取用户输入的路由信息+问号后面携带的数据
if request.COOKIES.get('name'):
res = func_name(request, *args, **kwargs)
return res
'''将路由拼接在/login/?的后面,在登录界面可以将路由拿到并进行跳转'''
return redirect('/login/?next=%s' % target_path)
return inner
所谓退出登录本质就是将客户端的标识用户身份的cookie删除掉
django操作session
由于session是保存在服务端上面的数据,就应该有个地方能够存储,我们只需要执行数据库迁移命令即可,django会自动创建很多需要的表.django默认的session失效时间是14天.
设置session
request.session['key']=value
def session_func(request):
request.session['session的键'] = '今天周四,又是疯狂星期四'
return HttpResponse('session_func')
1.存数据底层发生原理:
1.1当执行request.session['key']=value之后,首先生成一个随机字符串,就是session_key
1.2对value做加密处理,django会在django_session表中存储session_key以及session_data的对应关系。session_data对应的就是我们添加的值'今天周四,又是疯狂星期四'。
1.3将随机字符串session_key发一份给cookie。
此后登陆服务端session会校验用户是否有该字符串,如果有的话在一定时间内就可以不用登录。
获取session
语法结构:request.session.get('key')
def session_get(request):
print(request.session.get('session的键'))
return HttpResponse('session_get') # 今天周四,又是疯狂星期四
底层原理:
1.自动获取客户端携带的加密字符串
2.自动去django_session表中根据随机字符串获取加密的数据(比对是否有对应记录)
3.如果有自动获取加密的数据并解密到request.session.get()中
补充知识:
1.可以设置过期时间,python解释器默认的是UTC时间
2.存储session的数据位置也可以修改
# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()
# 检查会话session的key在数据库中是否存在
request.session.exists("session_key")
# 删除当前会话的所有Session数据
request.session.delete()
# 删除当前的会话数据并删除会话的Cookie。
request.session.flush()
# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。

浙公网安备 33010602011771号