什么是cookie
1、由于BS架构基于HTTP协议,是无状态的,不能保存客户端状态
2、使用cookie/session技术可以保存客户端用户状态
3、cookie是服务端生成发送给客户端的键值对,浏览器会保存它
4、浏览器可以设置禁止cookie的写入,即不保存cookie
cookie原理
cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;
当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了
Django中操作cookie
视图函数都是返回一个对象,只需要给这个对象进行操作就可以了
# 一般有三种方式返回数据 obj = HttpResponse() # 中间写设置等操作。。 return obj obj = render() return obj obj = redirect() return obj
服务端获取cookie
request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
参数:
- default: 默认值
- salt: 加密盐
- max_age: 后台控制过期时间
设置cookie
rep = HttpResponse(...) rep = render(request, ...) rep.set_cookie(key,value,...) rep.set_signed_cookie(key,value,salt='加密盐', max_age=None, ...)
参数:
- key, 键
- value='', 值
- max_age=None, 超时时间
- expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
- path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
- domain=None, Cookie生效的域名
- secure=False, https传输
- httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
删除cookie
obj.delete_cookie('k1') ''' 删除cookie意味着注销客户端用户 定义注销视图函数即可''' def logout(request): obj = redirect('/login/') obj.delete_cookie('user')
什么是session
Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息
我们可以给每个客户端的Cookie分配一个唯一的id,这样用户在访问时,通过Cookie,服务器就知道来的人是“谁”。然后我们再根据不同的Cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。
总结而言:Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;但是Cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息以及超过4096字节的文本
Django中操作session
创建cookie_session表
1、在django项目第一次创建表,迁移同步到数据库中时,会默认创建多个表,其中包括diango_sessioon表
2、在django_session表创建完成的情况下,才能操作session
设置session
def set_session(request): request.session['name'] = 'kai' return HttpResponse("set_session") ''' 1、使用的name:kai键值对,是生成cookie的相同的键值对 2、django内部自动调用算法生成一个随机的字符串 3、django_session表中添加数据 以2中生成的字符串为主键session_key 给数据加密生成字符串,添加进session表中session_data 同时,自动生成session有效期限,mysql默认为14天 '''
获取session
def get_session(request): print(request.session.get('name')) return HttpResponse("get_session") ''' 1、Django内部自动去请求头里面获取cookie 2、拿着session所对应的随机字符串去django_session表中比对session_key 3、如果比对上了,获取对应的session_data,放入request.session中,以供程序员调用 4、如果没有比对上,那么request.session就是一个空字典 '''
删除session
def del_session(request): request.session.flush() return HttpResponse('注销了') ''' 1、一个客户端对应django_session表中的一条数据 2、删除session,就是将该客户端对应的所有cookie删除 '''
设置失效时间
request.session.set_expiry(value) ''' 1、value是个整数,时间单位是秒 2、value是个datatime或者timedelta,那就是最后的有效期 3、value是0,用户关闭浏览器就会 失效 4、value是None,session会依赖全局session失效策略 '''
Session版本登陆验证
from functools import wraps def login_auth(func): @wraps(func) def inner(request, *args, **kwargs): target_url = request.path_info if request.COOKIES.get('username'): res = func(request, *args, **kwargs) return res else: return redirect(f'/login/?next={target_url}') return inner def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') if username == 'kai' and password == '123': target_url = request.GET.get('next') # 判断用户登陆之前是否有想要访问的url if target_url: # 如果有,就跳转回登陆之前的URL obj = redirect(target_url) # 否则默认跳转到home页面 else: obj = redirect('/home/') # 设置cookie obj.set_cookie('username', 'kai') return obj return render(request, 'login.html') @login_auth def logout(request): obj = HttpResponse('注销了') obj.delete_cookie('username') return obj