cookie和session的区别:
1.cookie;
cookie是保存在浏览器端的键值对,可以用来做用户认证
2.session;
将用户的会话信息保存在服务端,key值是随机产生的字符串,value值是session的内容
依赖于cookie将每个用户的随机字符串保存到用户浏览器上.
Django中session默认保存在数据库中:django_session表
flask,session默认将加密的数据写在用户的cookie中
Cookie的原理
1.客户端向服务端发送请求,第一次的值为空 cookie:{}
2.服务端接受请求后,设置cookie,request.set_cookie(key,value,),随着响应发给浏览器
3.客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器
当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!
如果想看到浏览器的Cookie可以点击浏览器的 锁 或者 感叹号
设置Cookie
# 1.设置cookie HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False) #参数: #key: cookie的名称(*) #value: cookie的值,默认是空字符 #max_age:cookies的持续有效时间(以秒计),如果设置为 None,cookies 在浏览器关闭的时候就失效了。 #expires:cookies的过期时间,格式:"Wdy, DD-Mth-YY HH:MM:SS GMT" 如果设置这个参数,它将覆盖max_age。 #path: cookie生效的路径前缀,浏览器只会把cookie回传给带有该路径的页面,这样你可以避免将cookie传给 站点中的其他的应用。/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问 #domain: cookie生效的站点。你可用这个参数来构造一个跨站cookie。如, domain=".example.com" 所构造的 cookie对下面这些站点都是可 读的: www.example.com 、 www2.example.com。 如果该参数设置为None,cookie只能由设置它的站点读取。 #secure: 如果设置为 True ,浏览器将通过HTTPS来回传cookie。 #httponly: 仅http传输 不能使用js获取cookie #同set_cookie,不同点在于设置salt,即加盐,加密存储cookie数据 HttpResponse.set_signed_cookie(key, value, salt='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)
获取Cookie
#2 获取cookie HttpRequest.COOKIES.get(key) #获取加“盐”的cookie HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
删除Cookie
# 3删除cookie HttpResponse.delete_cookie(key, path='/', domain=None)
Session
Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;但是Cookie本身保存在客户端,可能被拦截或窃取,自身安全性较差;
而Session保存在服务器,有较高的安全性。
所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息
session的特性:
Session是服务器端技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,
由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,
当用户再去访问该服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
Session配置
首先在settings.py中有如下配置(系统默认),
INSTALLED_APPS = [ 'django.contrib.sessions', ] MIDDLEWARE = [ 'django.contrib.sessions.middleware.SessionMiddleware', ]
session操作
def doregister(request): username = request.POST.get('username') password = request.POST.get('password') email = request.POST.get('email') user = User() user.username = username user.password = md5(password.encode('utf8')).hexdigest() user.email = email user.save() # 设置session request.session['username'] = username return render(request,"common/notice.html",context={ 'code':1, 'msg':'注册成功', 'url':'three:index', 'wait':3 })
获取Session
def index(request): # session获取 username = request.session.get('username') return render(request,'three/index.html',context={'username':username})
删除Session
def logout(request): request.session.flush() return redirect(reverse("three:index"))
#clear() 清空所有session 但是不会将session表中的数据删除
#flush() 清空所有 并删除表中的数据
#logout() 退出登录 清除所有 并删除表中的数据
#del req.session[‘key’] 删除某一个session的值
Session常用操作
1.设置session: request.session["is_login"]="1" 2.获取session: request.session.get(""is_login") 3.只删除session数据 request.session.delete() 4.删除session数据和cookie request.session.flush() 5.设置会话Session和Cookie的超时时间 request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 cookie值消失 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。 6.在setting中添加 SESSION_SAVE_EVERY_REQUEST =True 每次请求都保存Session设置后,如果存在数据库中,需要迁移数据库