zoukankan      html  css  js  c++  java
  • Django session

    session

    介绍

      cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生。cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。cookie虽然在一定程度上解决了“保持状态”的需求,但是由于cookie本身最大支持4096字节,以及cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是session。

      问题来了,基于http协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的cookie就起到桥接的作用。我们可以给每个客户端的cookie分配一个唯一的id,这样用户在访问时,通过cookie,服务器就知道来的人是“谁”。然后我们再根据不同的cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。

      结而言:cookie弥补了http无状态的不足,让服务器知道来的人是“谁”;但是cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过cookie识别不同的用户,对应的在session里保存私密的信息以及超过4096字节的文本。

      另外,上述所说的cookie和session其实是共通性的东西,不限于语言和框架

    cookie与session比较

      (a)cookie是保存在浏览器端的键值对,而session是保存的服务器端的键值对,但是依赖cookie。(也可以不依赖cookie,可以放在url,或请求头但是cookie比较方便)

      (b)以登录为例,cookie为通过登录成功后,设置明文的键值对,并将键值对发送客户端存,明文信息可能存在泄漏,不安全;session则是生成随机字符串,发给用户,并写到浏览器的cookie中,同时服务器自己也会保存一份。

      (c)在登录验证时,cookie:根据浏览器发送请求时附带的cookie的键值对进行判断,如果存在,则验证通过;session:在请求用户的cookie中获取随机字符串,根据随机字符串在session中获取其对应的值进行验证

    原理如下:

    session的分类

      如上,根据session在服务器中的保存位置分如下5种:

    (1)数据库session

      顾名思义,session的数值是保存在数据库中的,Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。使用此类型session之前需要通过执行如下两个命令进行创建session需要的表。如下:

    python manage.py makemigrations
    python manage.py migrate

    此类型session的基本文件配置如下,在setting.py文件中进行配置设置:

    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
        
        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,默认修改之后才保存(默认)

      session的使用如下:

    设置:

    获取:

    删除:

    def index(request):
            # 获取、设置、删除Session中数据
            request.session['k1']
            request.session.get('k1',None)
            request.session['k1'] = 123
            request.session.setdefault('k1',123) # 存在则不设置
            del request.session['k1']
     
            # 所有 键、值、键值对
            request.session.keys()
            request.session.values()
            request.session.items()
            request.session.iterkeys()
            request.session.itervalues()
            request.session.iteritems()
     
     
            # 用户session的随机字符串
            request.session.session_key
     
            # 将所有Session失效日期小于当前日期的数据删除
            request.session.clear_expired()
     
            # 检查 用户session的随机字符串 在数据库中是否
            request.session.exists("session_key")
     
            # 删除当前用户的所有Session数据
            request.session.delete("session_key")
     
            request.session.set_expiry(value)
                * 如果value是个整数,session会在些秒数后失效。
                * 如果value是个datatime或timedelta,session就会在这个时间后失效。
                * 如果value是0,用户关闭浏览器session就会失效。
                * 如果value是None,session会依赖全局session失效策略。

    (2)缓存session

      使用方式基本一样,其配置文件内容如下:

    配置 settings.py
     
        SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
        SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
     
     
        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,默认修改之后才保存

    (3)文件session

    (4)缓存+数据库session

    (5)加密cookie session

    -------------------------------------流程----------------------------

        session
            写:
                """
                    {
                        “xxxx的随机字符串”:{'id':1,'name':'俊杰'},
                        “xx的随机字符串”:{'id':11},
                    }
    
                表:
                    session_key           value
                    xxxx的随机字符串   asfasdfasdfasdfwer2342fszdfsdfs
    
                1. 生成随机字符串
                2. 把随机字符串写到客户端浏览器cookie中
                3. 在内存中大字典写入:
                    {
                        随机字符串: {'id':用户id}
                    }
                """
                request.session['id'] = obj.id
                request.session['name'] = obj.name
    
    
    
            读:
                """
                1. 获取客户端cookie中的随机字符串
                2. 如果有:
                        则获取 key 对应的值
                        否则 返回None
    
                """
                user_id = request.session.get('id')
  • 相关阅读:
    HDU 2639 Bone Collector II (01背包,第k解)
    POJ 2184 Cow Exhibition 奶牛展(01背包,变形)
    hihoCoder #1165 : 益智游戏 (挑战赛11 B题)
    UVA 562 Dividing coins 分硬币(01背包,简单变形)
    POJ Charm Bracelet 挑饰品 (常规01背包)
    hiho一下 第四十四周 博弈游戏·Nim游戏(直接公式解)
    UVA 624 CD(01背包,要记录路径)
    118 Pascal's Triangle 帕斯卡三角形 杨辉三角形
    117 Populating Next Right Pointers in Each Node II 每个节点的右向指针 II
    116 Populating Next Right Pointers in Each Node 每个节点的右向指针
  • 原文地址:https://www.cnblogs.com/jassin-du/p/8378451.html
Copyright © 2011-2022 走看看