Django框架(十一)--cookie和session
cookie和session组件
cookie
1.cookie的由来
大家都知道HTTP协议是无状态的。
无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。
一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的。
状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样一个场景下诞生。
2.什么是cookie
存储在客户端浏览器上的键值对。
随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。 Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!
3.cookie的工作原理
cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。
4.cookie的覆盖
如果服务器端发送重复的Cookie那么会覆盖原有的Cookie,例如客户端的第一个请求服务器端发送的Cookie是:Set-Cookie: a=A;第二请求服务器端发送的是:Set-Cookie: a=AA,那么客户端只留下一个Cookie,即:a=AA。
5.在浏览器中查看cookie F12打开开发者工具
6.cookie的操作
1.基本语法
#如何操作cookie
django返回给客户端浏览器的都必须是HttpResponse对象
obj = HttpResponse()
obj.set_cookie('key','value') #设置cookie就是在HttpResponse对象上
return obj #也相当于返回HttpResponse() #获取cookie,从request对象中取
request.COOKIE.get('k') #删除cookie,HttpResponse对象上
obj.delete_cookie('k') 设置超时时间 (时间以秒为单位)
max_age=None, 超时时间
expires=None, 超时时间(用于IE浏览器)
2.登录认证
from functools import wraps
def login_auth(func):
@wraps(func)
def inner(request,*args,**kwargs):
target_url = request.get_full_path()
if request.COOKIES.get('name'): #验证是否已经存在cookie值
res = func(request,*args,**kwargs)
return res
else:
return redirect('/lg/?next=%s'%target_url)
return inner
@login_auth
def order(request):
return HttpResponse('我是订单页面,我得登录才能看')
7.cookie加盐
def salt_cookie(request):
object = HttpResponse('ok')
# 加盐,123是个密码,解cookie的时候需要它,
object.set_signed_cookie('name','lqz',salt='')# max_age,三天失效
object.set_cookie('name','lqz',max_age=60*60*24*3)
# path,只有访问shopping的时候,才会携带cookie过来
object.set_cookie('name', 'lqz', path='/shopping/')
object.set_cookie('name', 'lqz')
return object
加盐其他属性
domain 设置域名下有效domain='map.baidu.com'
expires 超时时间,传一个datatime对象
secure=False (默认是false,设置成True浏览器将通过HTTPS来回传cookie)
httponly=True 只能https协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
cookie总结:
设置cookie两种方法:
rep = HttpResponse(...)
rep = render(request, ...)
#第一种
rep.set_cookie(key,value,...)
#第二种
rep.set_signed_cookie(key,value,salt='加密盐', max_age=None, ...) 获取cookie两种方法:
#第一种
request.COOKIES.get('key')
#第二种
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) 删除cookie方法:
rep.delete_cookie('key')
session
1.什么是session
Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是Session。
问题来了,基于HTTP协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的Cookie就起到桥接的作用。
我们可以给每个客户端的Cookie分配一个唯一的id,这样用户在访问时,通过Cookie,服务器就知道来的人是“谁”。然后我们再根据不同的Cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。
总结而言:Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;但是Cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息以及超过4096字节的文本。
另外,上述所说的Cookie和Session其实是共通性的东西,不限于语言和框架。
session就是保存在服务器上的键值对,session虽然是保存在服务器上的键值对,但是它是依赖于cookie工作的
服务端返回给浏览器一个随机的字符串,浏览器以键值对的形式保存cookieid:随机字符串
浏览器在访问服务端的时候,就会将随机字符串携带上:
后端获取随机字符串与后端的记录做对比
随机字符串1:数据1
随机字符串2:数据2
2.session的使用
#设置session
request.session['name'] = 'jason'
#设置的session键值对以字典的形式存储到django_session表中的session_data中 #设置session时:
1.django内部自动生成一个随机字符串
2.将随机字符串和你要保存的数据写入django_session表中(先在内存中生成一个缓存记录,等到经过中间件的时候才会执行)
3.将产生的随机字符串发送到浏览器写入cookie
sessionid:随机字符串 #取值
request.session.get('name')
#取值时:
1.django内部会自动从请求信息中获取到随机字符串
2.拿着随机字符串去django_session表中对比
3.一旦对比上了就将对应的数据拿出来放在request.session中 #删除浏览器的sessionid信息,为了减轻数据库的查询负担,过一段时间会自动把服务器的session删除
request.session.delete() #将浏览器和服务端全部删除(推荐使用这个)
request.session.flush()
这用于确保前面的会话数据不可以再次被用户的浏览器访问
设置,获取,删除
#设置session
def set_session(request):
request.session['xxx'] = 'xxx'
request.session.set_expiry(30) #设置30秒过期
return HttpResponse('set_session') #获取session
def get_session(request):
request.session.get('xxx')
return HttpResponse('get_session') #删除session
def delete_session(request):
request.session.flush()
return HttpResponse('delete_session')
3.session配置
1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) 2. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 其他公用设置项:
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
设置超时时间
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。
Django框架(十一)--cookie和session的更多相关文章
- Django框架 之 Cookie、Session整理补充
Django框架 之 Cookie.Session整理补充 浏览目录 Django实现的Cookie Django实现的Session 一.Django实现的Cookie 1.获取Cookie 1 2 ...
- Django框架 之 Cookie和Session初识
Django框架 之 Cookie和Session初识 浏览目录 Cookie介绍 Django中的Cookie Session 一.Cookie介绍 1.Cookie产生的意义 众所周知,HTTP协 ...
- Django框架07 /cookie和session
Django框架07 /cookie和session 目录 Django框架07 /cookie和session 1. django请求生命周期 2. cookie 3. session 4. 总结 ...
- Python 之 Django框架( Cookie和Session、Django中间件、AJAX、Django序列化)
12.4 Cookie和Session 12.41 cookie Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务 ...
- Django框架之cookie和session及开发登录功能
1.cookie是什么? Web应用程序是使用HTTP协议传输数据的.HTTP协议是无状态的协议.一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接.这就意味着服务器无法从 ...
- {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session
Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...
- 【python】-- Django 分页 、cookie、Session、CSRF
Django 分页 .cookie.Session.CSRF 一.分页 分页功能在每个网站都是必要的,下面主要介绍两种分页方式: 1.Django内置分页 from django.shortcuts ...
- 第三百一十二节,Django框架,Cookie
第三百一十二节,Django框架,Cookie 注意:获取Cookie是在请求对象里处理,设置Cookie是在响应对象里处理 普通Cookieset_cookie()设置普通cookie 参数: ke ...
- Django中的cookie与session
cookie与session的实现原理 HTTP被设计为”无状态”,每次请求都处于相同的空间中. 在一次请求和下一次请求之间没有任何状态保持,我们无法根据请求的任何方面(IP地址,用户代理等)来识别来 ...
- django基础 -- 8.cookie 和 session
一. cookie 1.cookie 的原理 工作原理是:浏览器访问服务端,带着一个空的cookie,然后由服务器产生内容, 浏览器收到相应后保存在本地:当浏览器再次访问时,浏览器会自动带上Cooki ...
随机推荐
- Spring Could Feign 设计原理
什么是Feign? Feign 的英文表意为"假装,伪装,变形", 是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,而不用像Java中通过封装HT ...
- SDOI2019快速查询
链接 vijos 思路 虽然询问1e7,但他询问很有意思,所以最多修改1e5个. 先把他们修改的点缩小到1e5之内并没有什么影响. 然后维护mul和add.不修改很好弄,修改的点可以弄点式子加加减减弄 ...
- AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图
AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...
- 洛谷 P2356 【弹珠游戏】题解
自我感觉应该没有用结构体做的吧 这道题其实非常水 很适合初学贪心的同学做一下 我好像没有用贪心做,嘻嘻 首先先读题, 题目中说这个游戏只能消灭当前所在位置的行.列的敌人 首先特判一下: if(tt== ...
- 【JZOJ6231】【20190625】等你哈苏德
题目 有\(m\)条线段,每条线段为\([l_i,r_i]\),每条线段可以是黑/白色 有些线段已经被染色,有些需要被确定颜色 询问是否存在一种染色方案,使得对于每一个位置\(i\),覆盖它的线段黑白 ...
- HDU 6212 Zuma
Zuma 这个题没有素质!它卡常! 我发现网上很多人的题解都写得很奇怪,也不好确定正确性,所以我借这篇题解表达一下愚见 定义$ dp[i][j][0...4]$表示 0:消完了 1:还剩1个0 2:还 ...
- Spring实现多数据源配置
一.前言 对于小型项目,服务器与数据库是可以在同一台机子上的,但随着业务的庞大与负责,数据库和服务器就会分离开来.同时随着数据量的增大,数据库也要分开部署到多台机子上. 二.Spring配置文件修改 ...
- mysql一对多表结构,查询一的信息的同时统计多的数量
res_resource_catalog表对于res_info_item表是一对多, 查询res_resource_catalog信息的同时,统计res_info_item中该条res_resourc ...
- Elasticsearch Java Rest Client简述
ESJavaClient的历史 JavaAPI Client 优势:基于transport进行数据访问,能够使用ES集群内部的性能特性,性能相对好 劣势:client版本需要和es集群版本一致,数据序 ...
- WIN10 删除此电脑7个文件夹-REG运行代码
Windows Registry Editor Version 5.00 [-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ ...