Django基础之cookie和session
简介:由于HTTP协议是无状态的,所以没有办法保持会话,基于这种情况,浏览器发展出了cookie技术,通过cookie就能够完成持续对话,大致过程就是类似一个字典的东西,从客户端浏览器访问服务的时候,带着这个字典,那么后端服务器就能够将身份认证的标识或者一些其他的信息,放到cookie里面,供客户端使用,并且以后客户端再来访问服务端就会一直带着这个cookie,后端就客户端的认证就可以从cookie里面的数据进行认证,从而完成保持会话的功能.
Ctrl+Shift+del 三个键来清除页面缓存和cookie,会经常用到
什么是cookie?
cookie是浏览器的技术,指的是一段小信息,它是服务器发送出来的存储在浏览器上的一组组键值对,在下次访问服务器是浏览器会带着这些键值对,以方便服务器提取有用信息.
cookie的工作原理
浏览器访问服务端,带着一个空的cookie,然后由服务器产生内容,浏览器收到相应后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。
一.django中操作cookie
1.设置cookie
ret=HttpResponse(...)
ret=render(request,'...')
ret.set_cookie(键,True) #创建一个cookie
ret.set_signed_cookie(键,True,salt='加密盐',max_age='',..) #对设置的cookie进行加密处理,max
_age表示该cookie 存在的时间,到达这个时间之后这个cookie自动删除
参数:
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获取(不是绝对,底层抓包可以获取到也可以被覆盖)
2.获取cookie
request.COOKIES['cookie的键']
request.COOKIES.get('cookie的键')
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
参数:
default: 默认值
salt: 加密盐
max_age: 后台控制过期时间
3.set_cookie方法源码:
class HttpResponseBase:
def set_cookie(self, key, 键
value='', 值
max_age=None, 超长时间 ,有效事件,max_age=20意思是这个cookie20秒后就消失了,默认时长是2周,这个是以秒为单位的
cookie需要延续的时间(以秒为单位)
如果参数是\ None`` ,这个cookie会延续到浏览器关闭为止。
expires=None, 超长时间,值是一个datetime类型的时间日期对象,到这个日期就失效的意思,用的不多
expires默认None ,cookie失效的实际日期/时间。
path='/', Cookie生效的路径,就是访问哪个路径可以得到cookie,'/'是所有路径都能获得cookie
浏览器只会把cookie回传给带有该路径的页面,这样可以避免将
cookie传给站点中的其他的应用。
/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
domain=None, Cookie生效的域名
你可用这个参数来构造一个跨站cookie。
如, domain=".example.com"
所构造的cookie对下面这些站点都是可读的:
www.example.com 、 www2.example.com
和an.other.sub.domain.example.com 。
如果该参数设置为 None ,cookie只能由设置它的站点读取。
secure=False, 如果设置为 True ,浏览器将通过HTTPS来回传cookie。
httponly=False 只能http协议传输,无法被JavaScript获取
(不是绝对,底层抓包可以获取到也可以被覆盖)
): pass
4.删除cookie
def logout(request):
rep = redirect("/login/")
rep.delete_cookie("user") # 删除用户浏览器上之前设置的usercookie值
return rep
二.jquery中的cookie操作
1.添加一个cookie
$.cookie('the_cookie','the_value');
2.创建一个cookie,设置时间为7天
$.cookie('the_cookie','the_value',{expires:7});
3.创建一个cookie并设置cookie的有效路径
$.cookie('the_cookie','the_value',{expires:7,path:'/'});
在默认情况下,只有设置 cookie的网页才能读取该 cookie。如果想让一个页面读取另一个页面设置的cookie,必须设置cookie的路径。cookie的路径用于设置能够读取 cookie的顶级目录。将这个路径设置为网站的根目录,可以让所有网页都能互相读取 cookie (一般不要这样设置,防止出现冲突)。
4.读取cookie
$.cookie('the_cookie');
5.删除cookie
$.cookie('the_cookie',null);
6.可选参数
$.cookie('the_cookie','the_value',{expires:7, path:'/', domain:'jquery.com', secure:true })
参数:
expires:(Number|Date)有效期;设置一个整数时,单位是天;也可以设置一个日期对象作为Cookie的过期日期;
path:(String)创建该Cookie的页面路径; domain:(String)创建该Cookie的页面域名; secure:(Booblean)如果设为true,那么此Cookie的传输会要求一个安全协议,例如:HTTPS;
三.sessoin
django中session相关方法
注意:这都是django提供的方法,其他的框架就需要你自己关于cookie和session的方法了。
# 获取、设置、删除Session中数据
#取值
request.session['k1']
request.session.get('k1',None) #request.session这句是帮你从cookie里面将sessionid的值取出来,将django-session表里面的对应sessionid的值的那条记录中的session-data字段的数据给你拿出来(并解密),get方法就取出k1这个键对应的值
#设置值
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在则不设置
#帮你生成随机字符串,帮你将这个随机字符串和用户数据(加密后)和过期时间保存到了django-session表里面,帮你将这个随机字符串以sessionid:随机字符串的形式添加到cookie里面返回给浏览器,这个sessionid名字是可以改的,以后再说
#但是注意一个事情,django-session这个表,你不能通过orm来直接控制,因为你的models.py里面没有这个对应关系
#删除值
del request.session['k1'] #django-session表里面同步删除
# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
# 会话session的key
session_key = request.session.session_key 获取sessionid的值
# 将所有Session失效日期小于当前日期的数据删除,将过期的删除
request.session.clear_expired()
# 检查会话session的key在数据库中是否存在
request.session.exists("session_key") #session_key就是那个sessionid的值
# 删除当前会话的所有Session数据
request.session.delete()
# 删除当前的会话数据并删除会话的Cookie。
request.session.flush() #常用,清空所有cookie---删除session表里的这个会话的记录,
这用于确保前面的会话数据不可以再次被用户的浏览器访问
例如,django.contrib.auth.logout() 函数中就会调用它。
# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。
1.简单介绍:
Sessoin是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于 session为用户浏览器独享,所以用户在访问服务器的web资源时 ,可以把各自的数据放在各自的session中,当用户再去访问该服务器中的其它web资源时,其它web资源再从用户各自的session中 取出数据为用户服务。
拿我们下面的例子简单来说: 用户在访问服务器时,我们通过session执行这条命令'request.session['is_login']=True ',相当于执行了以下操作,
#1.生成一个随机字符串,sessionid:随机字符串
#2.加密一些用户的信息,保存到数据库中的django_session表中个 #session_key session_data #随机字符串 加密的用户信息
#3.将session:随机字符串放到cookie{}里面
之后该用户再翻身顾问该服务器的其他web服务时,其它web资源再从用户各自的session中 取出数据为用户服务。
2.cookie和session的合并使用:
#views视图部分
def login(request): if request.method=='GET': return render(request,'login.html') else: username=request.POST.get('username') password=request.POST.get('password') #从前端获取用户输入的信息 if username=='景导' and password=='666': request.session['is_login']=True #执行这一步之前要确认数据库中有django_session表,不然会报错,因为要在这个表中添加信息 #这一步相当于做了三件事 #1.生成一个随机字符串,sessionid:随机字符串 #2.加密一些用户的信息,保存到数据库中的django_session表中个 #session_key session_data #随机字符串 加密的用户信息 #3.设置cookie,将sessionid:随机字符串放到cookie{}里面 #ret.set_cookie() return redirect('home') # ret.set_cookie('is_login',True,max_age=5) # ret.set_cookie('is_login',True) # return ret else: return redirect('login') def login_auth(f): def inner(request): #做一个装饰器,执行每一步操作时,用来检验是否存在cookie if request.method == 'GET': #如果不存在,则跳转到指定页面, #进行一些操作获得cookie之后才允许执行别的操作 cookie_obj = request.session.get('is_login') print(cookie_obj, type(cookie_obj)) if cookie_obj != True: return redirect('login') ret=f(request) return ret return inner @login_auth def home(request): return render(request, 'home.html') @login_auth def index(request): return render(request,'index.html') def out(request): request.session.flush() return redirect('login')