cookie与session,django中间件

本文详细介绍了Django中Cookie和Session的基本概念、区别,以及如何在Django中设置、获取、删除Cookie和Session。此外,涵盖了session的存储特点和过期时间设置,以及如何利用中间件进行全局功能扩展。
摘要由CSDN通过智能技术生成

cookie与session简介

cookie

Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。

当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
信息保存的时间可以根据需要设置.

强调:

  1. 如果没有设置Cookie失效日期,它们仅保存到关闭浏览器程序为止.

  2. 如果将Cookie对象的Expires属性设置为Minvalue,则表示Cookie永远不会过期.

  3. Cookie存储的数据量很受限制,大多数浏览器支持最大容量为4K,因此不要用来保存数据集及其他大量数据.

  4. 由于并非所有的浏览器都支持Cookie,并且数据信息是以明文文本的形式保存在客户端的计算机中,

  5. 因此最好不要保存敏感的,未加密的数据,否则会影响网站的安全性

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的特点

  1. session用于存储一次会话的多次请求的数据,存在服务器端
  2. session可以存储任意类型,任意大小的数据
  3. 浏览器关闭后,再次打开session也能相同
  4. session是以键值对的形式存储的
  5. session依赖于cookie;唯一标识码保存在sessionid cookie
  6. 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)进行设置的。

  1. 如果value是一个int类型,那么session将在value这个时间后过期,其中value代表的是秒。

  2. 如果value是一个datetime或者timedelta对象,那么这个session将在指定的时间后过期。datetime必须是使用了PickleSerializer进行序列化的。

  3. 如果value等于0,那么session将在web浏览器关闭后就直接过期。

  4. 如果value等于None,那么session将用settings.py中设置的全局过期字段SESSION_COOKIE_AGE,这个字段默认是14天,也就是2个礼拜。

  5. session的时候不会修改session的有效期,修改session的时候会重新设置session的有效期,会从修改的时间,重新计时。

  6. 如果settings.py中设置了SESSION_EXPIRE_AT_BROWSER_CLOSE=True,那么默认讲不再使用SESSION_COOKIE_AGE了,而是浏览器一关闭,session数据就会过期。这个值默认是为False

  7. 判断是否在session里面:

    "username" in request.session
    
  8. 获取所有session的key和value

    request.session.keys()
    
    request.session.values()
    
    request.session.items()
    
  9. 针对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:用户黑名单校验、用户访问频率校验、网站全局用户身份校验

自定义中间件

步骤

  1. 创建一个任意名称的文件夹
  2. 在该文件夹内创建一个任意名称的py文件
  3. 在该py文件内编写中间件类
  4. 配置文件中注册
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值