文章目录
cookie与session简介
cookie
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。
当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
信息保存的时间可以根据需要设置.
强调:
-
如果没有设置Cookie失效日期,它们仅保存到关闭浏览器程序为止.
-
如果将Cookie对象的Expires属性设置为Minvalue,则表示Cookie永远不会过期.
-
Cookie存储的数据量很受限制,大多数浏览器支持最大容量为4K,因此不要用来保存数据集及其他大量数据.
-
由于并非所有的浏览器都支持Cookie,并且数据信息是以明文文本的形式保存在客户端的计算机中,
-
因此最好不要保存敏感的,未加密的数据,否则会影响网站的安全性
session
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上
。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
每个用户访问服务器都会建立一个session,那服务器是怎么标识用户的唯一身份呢?事实上,用户与服务器建立连接的同时,服务器会自动为其分配一个SessionId。
Session和Cookie的区别
1、数据存储位置:cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、安全性:cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
3、服务器性能:session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4、数据大小:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、信息重要程度:可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。
django中操作cookie
设置cookie
设置cookie是设置值给浏览器的。因此我们需要通过response的对象来设置,设置cookie可以通过response.set_cookie来设置,这个方法的相关参数如下:
key:这个cookie的key。
value:这个cookie的value。
max_age:最长的生命周期。单位是秒。
expires:过期时间。跟max_age是类似的,只不过这个参数需要传递一个具体的日期,比如datetime或者是符合日期格式的字符串。如果同时设置了expires和max_age,那么将会使用expires的值作为过期时间。
path:对域名下哪个路径有效。默认是对域名下所有路径都有效。
domain:针对哪个域名有效。默认是针对主域名下都有效,如果只要针对某个子域名才有效,那么可以设置这个属性.
secure:是否是安全的,如果设置为True,那么只能在https协议下才可用。
httponly:默认是False。如果为True,那么在客户端不能通过JavaScript进行操作。
获取cookie
获取浏览器发送过来的cookie信息。可以通过request.COOKIES来或者。这个对象是一个字典类型。比如获取所有的cookie,那么示例代码如下:
cookies = request.COOKIES
request.COOKIES.get()
for cookie_key,cookie_value in cookies.items():
print(cookie_key,cookie_value)
删除cookie
通过delete_cookie即可删除cookie。实际上删除cookie就是将指定的cookie的值设置为空的字符串,然后使用将他的过期时间设置为0,也就是浏览器关闭后就过期。
举例说明
def set_cookie(request):
"""设置cookie"""
response = HttpResponse('success')
response.set_cookie('username', 'jkc', max_age=180) # 设置cookie,过期时间为180秒
return response
def get_cookie(request):
"""获取cookie"""
cookies = request.COOKIES
return HttpResponse(cookies.items())
def delete_cookie(request):
"""删除cookie"""
response = HttpResponse('删除cookie成功')
response.delete_cookie('username')
return response
django操作session
session的设置
request.session["username"] = "smart"
request.session["age"] = 18
request.session.set_expiry(7*24*3600) # 设置session过期时间为一周后
获取session
username = request.session["username"]
age = request.session.get("age", "")
删除session
# 清除所有session
request.session.clear() # 只删除session中值得部分
# 删除所有session
# request.session.flush() # 删除session中的整条记录
# 删除key为age的session
del request.session["age"]
session的特点
- session用于存储一次会话的多次请求的数据,存在服务器端
- session可以存储任意类型,任意大小的数据
- 浏览器关闭后,再次打开session也能相同
- session是以键值对的形式存储的
- session依赖于cookie;唯一标识码保存在sessionid cookie
- session也有过期时间,如果不指定默认是14天
session生成过程解析
"""
服务端保存用户相关状态信息 返回给客户端随机字符串
针对保存 django需要一张表来处理 >>> 自带的django_session表
ps:django数据库迁移命令会产生一堆默认的表 其中就有一张django_session表
"""
1.设置session内部发生的事情
1.产生一个随机字符串
2.表中存储随机字符串与加密数据的对应关系
3.并将产生的随机字符串也给客户端发送一份并让其保存
sessionid:随机字符串
2.获取session内部发送的事情
1.自动获取客户端请求中的随机字符串
2.自动去存储session数据的表中比对
3.如果比对成功自动获取并'解密处理'
session的过期时间设置
session
的有效期时间是通过request.session.set_expiry(value)
进行设置的。
-
如果
value
是一个int
类型,那么session
将在value
这个时间后过期,其中value
代表的是秒。 -
如果
value
是一个datetime
或者timedelta
对象,那么这个session
将在指定的时间后过期。datetime
必须是使用了PickleSerializer
进行序列化的。 -
如果
value
等于0
,那么session
将在web浏览器关闭后就直接过期。 -
如果
value
等于None,那么session
将用settings.py
中设置的全局过期字段SESSION_COOKIE_AGE
,这个字段默认是14天,也就是2个礼拜。 -
读
session
的时候不会修改session
的有效期,修改session
的时候会重新设置session
的有效期,会从修改的时间,重新计时。 -
如果
settings.py
中设置了SESSION_EXPIRE_AT_BROWSER_CLOSE=True
,那么默认讲不再使用SESSION_COOKIE_AGE
了,而是浏览器一关闭,session
数据就会过期。这个值默认是为False
。 -
判断是否在session里面:
"username" in request.session
-
获取所有session的key和value
request.session.keys() request.session.values() request.session.items()
-
针对session数据的存储位置 有五种方案
- 数据库存储
- 缓存存储
- 文件存储
- 缓存+数据库存储
- 动态加密
django中间件
django中间件简介
Django 中间件是修改 Django request 或者 response 对象的钩子,可以理解为是介于 HttpRequest 与 HttpResponse 处理之间的一道处理过程。
浏览器从请求到响应的过程中,Django 需要通过很多中间件来处理,可以看如下图所示:
Django 中间件作用:
- 修改请求,即传送到 view 中的 HttpRequest 对象。
- 修改响应,即 view 返回的 HttpResponse 对象。
中间件组件配置在 settings.py 文件的 MIDDLEWARE 选项列表中。
配置中的每个字符串选项都是一个类,也就是一个中间件。
Django 默认的中间件配置:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
django中间件五个常见方法
django不单有七个中间件并且每个都有很多功能和方法,除此之外django还支持自定义中间件并提供五个可以自定义的方法
-
process_request:
-
请求来的时候会按照配置文件中注册了的中间件 从上往下依次执行每一个中间件里面的process_request方法 如果没有则直接跳过
-
该方法如果返回了HttpResonse对象 那么请求不会再往后执行 原路返回
-
-
process_response:
-
响应走的时候会按照配置文件中注册了的中间件 从下往上一次执行每一个中间件里面的process_response方法 没有没有则直接跳过
-
该方法有两个形参request和response,并且
默认情况下应该返回response
-
该方法也
可以自己返回HttpResponse对象
,相当于将视图层返回的数据修改成自己的数据返回出去
-
-
process_view:这个是在请求走完之后,走视图函数之前执行的
-
process_exception:这个是当视图函数出现错误的时候会执行的
-
process_template_response:当视图函数返回对象中有一个render()的时候会执行
django中间件的使用场景:只要是全局相关的功能都可以在中间件中编写
eg:用户黑名单校验、用户访问频率校验、网站全局用户身份校验
自定义中间件
步骤
- 创建一个任意名称的文件夹
- 在该文件夹内创建一个任意名称的py文件
- 在该py文件内编写中间件类
- 配置文件中注册