【python】Django系列Day04--Cookie和Session

     阅读:40

🙋作者:爱编程的小贤
⛳知识点:Django–cookie和session
🥇:每天学一点,早日成大佬

👊前言

💎 💎 💎今天我们进入Django第四部分的学习啦!!! 🚀 🚀 🚀学习之前先要好好复习回顾前面的内容哦!!!
如果你看完感觉对你有帮助,,,欢迎给个三连哦💗!!!您的支持是我创作的动力。🌹 🌹 🌹 🌹 🌹 🌹 感谢感谢!!!😘😘😘


🎨一、Cookie

1.状态保持

  • 浏览器请求服务器是无状态的。
  • 无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次 新的请求。
  • 无状态原因:浏览器与服务器是使用Socket套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的Socket连接,而且服务器也会在处理页面完毕之后销毁页面对象。
  • 有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等
  • 实现状态保持主要有两种方式:
    • 客户端存储信息使用 Cookie
    • 服务器端存储信息使用 Session

2.什么是cookie?它的作用是什么?

没错是饼干😄 😄 😄

在这里插入图片描述

接着看下来吧!!!😁 😁 😁

Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。
Cookie最早是网景公司的前雇员LouMontulli在1993年3月的发明。Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。
Cookie名称和值可以由服务器端开发自己定义,这样服务器可以知道该用户是否是合法用户以及是否需要重新登录等。服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。Cookies最典型记住用户名。
Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用。

3.cookie的类型

可以按照过期时间分为两类:
会话cookie和持久cookie。
1、会话cookie是一种临时cookie,用户退出浏览器,会话Cookie就会被删除了。
2、持久cookie则会储存在硬盘里,保留时间更长,关闭浏览器,重启电脑,它依然存在,通常是持久性的cookie会维护某一个用户周期性访问服务器的配置文件或者登录信息。

4.cookie的特点

  • cookie以键值对的格式进行信息的存储。
  • cookie基于域名安全,不同域名的cookie是不能互相访问的。
  • 当浏览器请求某网站时,会将浏览器存储的跟网站相关的所有cookie信息提交给网站服务器。
  • cookie是有过期时间的,如果不指定,默认关闭浏览器之后cookie就会过期。

5.cookie的流程

1.我们的浏览器第一次请求服务器的时候,不会携带任何cookie信息
2.服务器接收到请求之后,发现请求中没有任何cookie信息
3.服务器设置一个cookie.这个cookie设置在响应中
4.我们的浏览器接收到这个响应之后,发现响应中有cookie信息,浏览器会将cookie信息保存起来 第二次及其之后的过程
5.当我们的浏览器第二次以及之后的请求都会携带cookie信息
6.我们的服务器接收到请求之后,会发现请求中携带cookie信息,这样的话就认识是谁发出的请求

在这里插入图片描述

6.设置cookie

对 HttpResponse()对象的set_cookie方法进行设置
HttpResponse().set_cookie(“a”,“b”,max_age=时长(int))

第一个参数是键名
第二参数是对应的值
参数max_age 设置过期时间,单位是秒
参数expires 设置到哪个时间过期 日期类型

def cookie_set1(request):
    response = HttpResponse()

    response.set_cookie('name', 'IU')   # 如果没有设置cookie的有效期的话,表示当前设置的cookie为会话cookie
    response.set_cookie('sex', 'woman', max_age=60)     # max_age,设置cookie的有效期,单位为秒
    response.set_cookie('height', '165', expires=60)
    response.set_cookie('weight', '45', expires='Sat Aug-28-2021 14:50:50 CST', httponly=True)
    response.set_cookie('yaowei', '280', expires=datetime(2021, 8, 28, 14, 50, 50), httponly=True)
    # 注意设置cookie的键的时候不要用中文
    # cookie以及session的设置都是使用的西八区的时区进行设置
    """
        expires:
        1. 同max_age一样,值为整型,单位为秒
        2. 格林威治时间:Sat Aug-28-2021 13:50:50 GMT
        3. datatime   默认也是使用的西八区的时区,比北京时间多8个小时,所以如果要设置为北京时间的有效期的话可以将其小时减少8个小时
        
        path='/':   指定cookie在网站域名中的存储路径
            此时表示cookie存放于当前域名的根路径
        
        domain:表示cookie允许获取的域名
            127.0.0.1
            xiaoyy.com
        secure:
            值类型为布尔类型,当其值为True的时候,表示仅允许在HTTPS请求时才能够访问到cookie
            反之则http也能够获取到cookie
        httponly:
            值类型是bool类型,当其为True,cookie就不能够通过js来获取
            反之则js能够获取到
    """
    return response

7.获取cookie

利用request的request.COOKIES[‘键名’]来获取cookie

def get_cookie(request):
  """获取cookie"""
  name = request.COOKIES['name']
  return HttpResponse(name)

🎨二、Session

1.启用session

Django项目默认启用Session。

可以在settings.py文件中查看,如图所示:
在这里插入图片描述
如果需要禁用session的话,就将上图的session中间件注释掉即可。

2.存储方式

在settings.py文件中,可以设置session数据的存储方式,可以保存的在数据库、本地缓存等。

1.数据库

存储在数据库中,如下设置可以写,也可以不写,这是默认存储方式。

# SESSION_ENGINE='django.cintrib.sessions.backends.db'
# SESSION_ENGINE='django.cintrib.sessions.backends.cache_db' # 存储于混合型的数据库之中,即二者皆用
SESSION_ENGINE='django.cintrib.sessions.backends.cache'   # 存储于非关系型的数据库
之中

在这里插入图片描述

如果存储在数据库中,需要在项INSTALLED_APP中安装Session应用。
请添加图片描述

2.Redis

在redis中保存session,需要引入第三方扩展,我们可以使用django-redis来解决

  1. 安装扩展

pip install django-redis

  1. 配置

在settings.py文件中做如下配置:

CACHES= {
  "default": {
    "BACKEND": "django_redis.cache.RedisCache",
    "LOCATION": "redis://127.0.0.1:6379/0",
    "OPTIONS": {
      "CLIENT_CLASS": "django_redis.client.DefaultClient",
   }
 }
}
# SESSION_ENGINE='django.contrib.sessions.backends.db'
# SESSION_ENGINE='django.contrib.sessions.backends.cache_db' # 存储于混合型的数据库之中,即二者皆用
SESSION_ENGINE='django.contrib.sessions.backends.cache'   # 存储于非关系型的数据库之中
SESSION_CACHE_ALIAS = "default"   # 指定缓存的默认库
  1. 设置session
request.session["name"] = "xiaoxian"
request.session["age"] = "18"    # 默认两周有效期
request.session.set_expiry(value)   # 设置有效期,单位:秒,如果值为0,那么也是关
闭浏览器后就清除掉session
# 如果value是一个整数,session将在value秒没有活动后过期
# 如果value为0,那么用户的Cookie将在用户的浏览器关闭时过期。
# 如果value为None,那么session有效期将采用系统默认值,默认为两周,可以通过在
settings.py中设置SESSION_COOKIE_AGE来设置全局默认值
  1. 查询
name = request.session.get("name")
mobile = request.session.get("mobile","123123123")  # 如果没有这个键,就返回其默认值,没有默认值就返回空
print(name)
 # 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
  1. 删除、清除
# 删除session
request.session.clear()  # 清除所有的session,在存储中删除值部分。
request.session.flush()  # 清除session数据,在存储中删除session的整条数据。
# del request.session['键']  
# 删除session中的指定键与值,在存储中只删除某个键及对应的值

🎨三、session 在settings.py文件中的其他参数设置

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_EXPIRE_AT_BROWSER_CLOSE = False         
# 是否关闭浏览器使得Session过期(默认)

SESSION_SAVE_EVERY_REQUEST = False           
# 是否每次请求都保存Session,默认修改之后才保存(默认)

🎨四、session的其它操作

# 用户session的随机字符串
request.session.session_key

# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()

# 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key")

# 删除当前用户的所有Session数据
request.session.delete("session_key")

总结

cookie和session到这里我们就讲完啦!!!!👍👍👍 如果有帮到你欢迎给个三连支持一下哦❤️ ❤️ ❤️
如果有哪些需要修改的地方欢迎指正啦!!!一起加油啦👏👏👏