18 cookie与session
一、cookie
- cookie大小限制为4KB
- 一个服务器最多在客户端浏览器上保存20个cookie
- 一个浏览器最多能保存300个cookie
views中添加cookie一定要添加在相应体中,相应体可以是render和redirect或HTTPResponse,render和redirect都属于HTTPResponse对象
def login(request): if request.method=='POST': name=request.POST.get('name') pwd=request.POST.get('pwd') user= UserInfo.objects.filter(name=name,pwd=pwd).first() if user: responst=HttpResponse("登录成功!") responst.set_cookie("is_login",True) return responst else: pass else: return render(request,'login.html') def index(request): #获取cookie cookie=request.COOKIES is_login=cookie.get('is_login') if is_login: return render(request,'index.html') else: return redirect('/login/')
设置cookie:response.set_cookit(key,val)
- key
- val
- max_age=None,超时时间,以秒为单位,不设置直到浏览器关闭。IE浏览器不支持
- expires=None,cookie失效的实际日期/时间,固定某个时刻失效,传入datetime测试
date=datetime.datetime(year=2018,month=7,day=21,hour=4,second=10) responst.set_cookie("is_login",True,expires=date)
- path='/',cookie生效路径。浏览器只会回传带有该路径的页面,避免跨应用访问。/表示根路径,特使的:根路径的cookie可以被任何url的页面访问
- domain=None,cookie生效的域名,可以用该参数构造跨站cookie。如设置domain='.example.com'对www.example.com,email.example.com都有效。不设置只有设置他的域名有效
- secure=False,设置为true,浏览器将通过https来回传cookie
- httponly=False,只能http协议传输,无法被JavaScript获取,非绝对
获取cookie:response.request.COOKIE.get(key)
删除cookie:response.delete_cookie(cookie_key,path="/",domain=name)
二、session
部分数据存放在服务器,给客户端的只是随机字符串。django自己维护一个django-session表
- 生成随机字符串
- 给浏览器返回cookie,sessionid=随机字符串
- 键值对存放到数据库
设置session,
在view中对登录进行验证,验证成功后设置session值
def login_session(request): if request.method=='POST': name=request.POST.get('name') pwd=request.POST.get('pwd') user= UserInfo.objects.filter(name=name,pwd=pwd).first() if user: """ 1、生成随机字符串 2、给相应体设置cookie,response.set_cookie('sessionid','随机字符串') 3、在django-session表中创建记录,session-key,session-data """ request.session['is_login']=True request.session['username']=user.name return HttpResponse('登录成功!') else: pass else: return render(request,'login.html')
浏览器得到一个sessionid的cookie
django-session表中会存在session数据,django对数据做了序列化处理
获取session
def index_session(request): """ 1、从request.COOKIE.get('sessionid')获取到sessionid值 2、从django-session中获取该sessionid对应的数据 3、将对应数据反序列化之后返回 """ is_login=request.session['is_login'] username=request.session['username'] if is_login: return render(request,'index.html',{'username':username}) else: return redirect('/login_session/')
更新session
一个浏览器针对一个服务器只能由一个session存在。重新登录,有数据则更新,无数据则增加
同一个浏览器重新用其他账号登录,将修改django-session表中session_data数据
删除session
不推荐用del方法来做注销,flush()
del request.session['session_name']
def logout_session(request): del request.session['is_login'] del request.session['username'] return redirect('/login_session/')
flush()实现注销功能
def logout_session(request): # del request.session['is_login'] # del request.session['username'] """ 1、通过sessionid过滤出改id 2、在django-session表中删除该条记录 3、将response中的sessionid的cookie也会删掉 """ request.session.flush() return redirect('/login_session/')
session其他配置,详见yuan博客
setting配置中将修改全局的配置
总结:
- response.set_cookie(key,val)
- request.COOKIE.get(key)
- request.session[key]=val
- request.session[key]
- request.session.flush()