cookie和session是干什么的
浏览器访问页面基于HTTP协议(超文本传输协议),而
HTTP协议是无状态的
,也就是说,下一次去访问一个页面时不知道上一次对这个页面做了什么。
所以,我们就需要cookie和session这两种方式来
状态保持
。
cookie
认识cookie
cookie是由服务器生成,
存储在浏览器端
的一小段文本信息
打个通俗的比方:
小明(浏览器)找老板(服务器)买豆浆,老板给小明一个单子(设置cookie),小明先保管一会单子(保存cookie),再用单子找老板要豆浆(读取cookie)
cookie的特点:
以
键值对
方式存储
通过浏览器访问一个网站时,会将浏览器存储的跟该网站相关的所有cookie信息(
request.COOKIES
)发送给该网站的服务器
cookie是基于域名安全的,浏览器访问一个网站时,只会把跟该网站相关的cookie信息发送给该网站的服务器,而不会发送和其他网站相关的cookie信息
cookie是有过期时间的,如果不指定,默认关闭浏览器之后cookie就会过期
注:request.COOKIES是一个标准的python字典,包含与要访问的网站相关的所有的cookie,键和值都为字符串
cookie的简单使用
话不多说,上代码举栗子
set_cookie页面设置cookie信息num=1,get_cookie页面读取cookie信息num=1
# 设置cookie信息
def set_cookie(request):
response = HttpResponse('设置cookie')
# 为浏览器设置一个cookie信息 可以set多次设置多个cookie
response.set_cookie('num',1)
return response
# 获取cookie信息
def get_cookie(request):
# 取出cookie num的值
num = request.COOKIES['num']
return HttpResponse(num)
划重点:
设置cookie需要一个HTTPResponse类或其子类(HTTPResponseRedirect、JsonResponse)的对象set_cookie方法
浏览器发给服务器的cookie保存在request对象的COOKIES中
刚才说到cookie是有过期时间的,如果不指定,默认关闭浏览器之后cookie就会过期。现在就来说一下
设置cookie的期限
。
第一种方法:在set_cookie方法中设置属性max_age,表示有效期的时间长度,以秒为单位
response.set_cookie('num',1,max_age=14*24*3600) # 两个星期
第二种方法:在set_cookie方法中设置属性expires表示过期的时间节点
from datetime import datetime,timedelta
response.set_cookie('num',1,expires=datetime.now()+timedelta(days=14)) # 两个星期
登录案例:cookie记住用户名
目标:如果用户第一次登录时勾选“记住用户名”并登录成功,那么用户在不关闭浏览器的情况下再返回登录页面,用户名回显在对应的输入框中
核心语句:
response.set_cookie('username', username)
设置cookie,
username = request.COOKIES['username']
获取cookie并渲染模板,html文件中相应的
用户名:
接收变量
login.html
登录页面
用户名:
密码:
记住用户名
django项目应用下的views.py
# 显示登录页面
def login(request):
# 获取cookie username
if 'username' in request.COOKIES:
# 获取记住的用户名
username = request.COOKIES['username']
else:
username = ''
return render(request, 'login/login.html',{'username':username})
# 获取提交的用户名和密码
def login_check(request):
username = request.POST.get('username')
password = request.POST.get('password')
remember = request.POST.get('remember')
# 进行登录校验
# 实际开发中根据用户名和密码查找数据库 此处用admin和123代替
if username=='admin' and password=='123':
# 用户名密码正确 跳转到首页
response = redirect('/index')
# 判断是否需要记住用户名
if remember == 'on': # 复选框的值 选中为on 不选中为None
# 设置cookie
response.set_cookie('username', username)
return response
else:
# 用户名密码错误 跳转到登录页面
return redirect('/login')
session
认识session
session是由服务器生成,并
存储在服务器端
的一小段文本信息
再打个通俗的比方:
小明(浏览器)去办健身卡,个人信息都保存在健身房(服务器)内,健身房给小明一个卡号(cookie sessionid),下次小明去健身房只要报卡号就可以
其中,django_session表存在服务器端的数据库中:
session_key
session_data
…
唯一标识码 sessionid
{‘username’:admin, ‘age’:20}
…
特点:
以
键值对
存储
依赖于cookie,唯一的标识码保存在cookie的sessionid中
有过期时间,如果不指定,默认两周后过期
session的简单使用
设置session:request.session[‘key’] = value
获取session:request.session[‘key’] 或 request.session.get(‘key’,default)。对于get方式,如果session中没有找到’key’,则返回指定默认值default。
清除所有session的值,保留键:request.session.clear()
清除所有session的键值对:request.session.flush()
删除session中的指定键值对:del request.session[‘key’]
设置session的过期时间:request.session.set_expiry(value)。如果value是一个整数,session_id cookie将在value秒后过期;如果value为0,session_id cookie将在浏览器关闭时过期;如果value为None,session_id cookie将在两周之后过期。
登录案例:session记住登录状态
还是在刚才登录那个栗子的基础上,加上session后的目标:用户第一次登录成功进入首页之后,无论关不关闭浏览器,两个星期内用户再次访问登录页面时,会直接跳转到首页
核心语句:
request.session['islogin'] = True
记住用户的登录状态,
request.session.has_key('islogin')
判断用户是否登录,只要session中有islogin就认为用户已经登录
django项目应用下的views.py
# 显示登录页面
def login(request):
# 判断用户是否登录
if request.session.has_key('islogin'):
# 若用户已登录 直接跳转到首页
return redirect('/index')
else:
# 获取cookie username
if 'username' in request.COOKIES:
# 获取记住的用户名
username = request.COOKIES['username']
else:
username = ''
return render(request, 'login/login.html',{'username':username})
# 获取提交的用户名和密码
def login_check(request):
username = request.POST.get('username')
password = request.POST.get('password')
remember = request.POST.get('remember')
# 进行登录校验
# 实际开发中根据用户名和密码查找数据库 此处用admin和123代替
if username=='admin' and password=='123':
# 用户名密码正确 跳转到首页
response = redirect('/index')
# 判断是否需要记住用户名
if remember == 'on':
# 设置cookie
response.set_cookie('username',username)
# 记住用户的登录状态 只要session中有islogin就认为用户已经登录
request.session['islogin'] = True
return response
else:
# 用户名密码错误 跳转到登录页面
return redirect('/login')
cookie和session的对比及应用场景
区别和联系:
两者都以键值对存储
cookie存储在浏览器端,session存储在服务器端
cookie取出的都是字符串类型,session取出的类型和存入的类型一致
两者都有过期时间,也都可以指定,但如果不指定,cookie默认关闭浏览器之后就会过期,session默认两周后过期
session依赖于cookie,其唯一的标识码保存在cookie的sessionid中
应用场景:
cookie:安全性要求不高的数据,如记住用户名
session:涉及到银行卡账号密码之类的安全性要求较高的数据,如记住登录状态