美文网首页
状态保持以及Cookie和session

状态保持以及Cookie和session

作者: haoxuan_xia | 来源:发表于2020-08-31 23:08 被阅读0次

    状态保持

    • 浏览器请求服务器是无状态无记忆的。
    • 无状态无记忆原因:浏览器与服务器是使用Socket进行通信的,服务器将请求结果返回给浏览器,会关闭当前的Socket连接,而且服务器也会处理页面完毕之后销毁页面对象。
    • 有时需要保持用户浏览的状态,所有我们要实现状态保持。
      1. 在客户端存储信息使用cookie
      1. 在服务器存储信息使用session

    Cookie 是保持在客户端,基于域名(Domain)的

    1. 设置Cookie
    def set_cookie(request):
     
        username = request.GET.get('username')
        response = HttpResponse('set_cookie')
        # 通过HttpResponse对象的set_cookie方法来设置cookie
        # max_age单位为秒, 默认是None 如果是临时cookie,可不设置
        response.set_cookie('username', username, max_age=3600)
        return response
    
    1. 读取Cookie
    def get_cookie(request):
    
        cookie = request.COOKIES
        username = cookie.get('username')
        return HttpResponse('get_cookie:', username)
    

    3.Cookie的请求流程

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

    4.从HTTP协议角度深度掌握Cookie流程

    • 第一次
      ① 我们是第一次请求服务器,不会携带任何cookie信息,请求头中没有任何cookie信息
      ② 服务器会为响应设置cookie信息. 响应头中有set_cookie信息
    • 第二次及其之后的
      ③ 我们第二次及其之后的请求都会携带cookie信息,请求头中有cookie信息
      ④ 在当前我们的代码中,没有在响应头中设置cookie,所以响应头中没有set_cookie信息

    Session是保存在服务器 依赖于Cookie,禁用Cookie则Session无法实现

    1.启用Session
    Django项目默认启用Session。

    image.png
    2.存储方式
    • 存储在数据库中,如下设置可以写,也可以不写,这是默认存储方式。
    SESSION_ENGINE='django.contrib.sessions.backends.db'
    
    # 如果存储在数据库中,需要在项INSTALLED_APPS中安装Session应用。
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',  # 安装Session应用
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'book.apps.BookConfig',
    ]
    
    • 本地缓存 存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快。
    SESSION_ENGINE='django.contrib.sessions.backends.cache'
    
    • 混合存储 优先从本机内存中存取,如果没有则从数据库中存取。
    SESSION_ENGINE='django.contrib.sessions.backends.cached_db
    
    • 在redis中保存session,需要引入第三方扩展,我们可以使用django-redis来解决。
    1) 安装扩展
    pip install django-redis
    2)配置
    
    在settings.py文件中做如下设置
    
    CACHES = {
        'default': {
            'BACKEND': 'django_redis.cache.RedisCache',
            'LOCATION': 'redis://127.0.0.1:6379/1',
            'OPTIONS': {
                'CLIENT_CLASS': 'django_redis.client.DefaultClient',
            }
        }
    }
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
    SESSION_CACHE_ALIAS = 'default'
    

    3.设置Session

    def set_session(request):
        # 1.cookie中没有任何信息
        print(request.COOKIES)
        #2.对用户名和密码进行验证
        # 假设认为 用户名和密码正确
        user_id=6666
        #3.设置session信息
        # 设置session的时候其实 session做了2件事
        #第一件: 将数据保存在数据库中
        #第二件: 设置一个cookie信息,这个cookie信息是以sessionid为key
        request.session['user_id']=user_id
    
        #4. 返回响应
        return HttpResponse('set_session')
    

    4.读取Session信息

    def get_session(request):
        # . 请求都会携带 session id信息
        print(request.COOKIES)
    
        # 2. 会获取到sessionid信息,然后进行验证,
        # 验证成功,可以获取 session信息(
        # request.session 字典
        user_id=request.session['user_id']
        user_id=request.session.get('user_id')
        # 3.返回响应
        return HttpResponse('get_session')
    

    5.Session流程

    • 第一次请求:
      ① 我们第一次请求的时候可以携带一些信息(用户名/密码) cookie中没有任何信息
      ② 当我们的服务器接收到这个请求之后,进行用户名和密码的验证,验证没有问题可以设置session 信息
      ③ 在设置session信息的同时(session信息保存在服务器端).服务器会在响应头中设置一个 sessionid 的cookie信息
      ④ 客户端(浏览器)在接收到响应之后,会将cookie信息保存起来(保存 sessionid的信息)
    • 第二次及其之后的请求:
      ⑤ 第二次及其之后的请求都会携带 session id信息
      ⑥ 当服务器接收到这个请求之后,会获取到sessionid信息,然后进行验证,
      验证成功,则可以获取 session信息(session信息保存在服务器端)

    6.HTTP协议角度深度掌握Session流程
    ① 第一次请求,在请求头中没有携带任何cookie信息
    ② 我们在设置session的时候,session会做2件事.
    #第一件: 将数据保存在数据库中
    #第二件: 设置一个cookie信息,这个cookie信息是以sessionid为key value为 xxxx
    ③ 第二次及其之后的:都会携带 cookie信息,特别是 sessionid

    相关文章

      网友评论

          本文标题:状态保持以及Cookie和session

          本文链接:https://www.haomeiwen.com/subject/vwipsktx.html