• 【Django】Session


    @



    介绍


    Cookie虽然在一定程度上解决了"保持状态"的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且它保存在服务器,有较高的安全性。这就是Session.

    问题来了,基于HTTP协议的无状态特征,服务器根本就不知道访问者是"谁",因此上述的Coolie就起到了桥接的作用.

    我们可以给每个客户端的Cookie分配一个唯一的id,这样用户在访问时,通过Cookie,服务器就知道来的人是"谁"了。然后我们再根据不同的Cookie的id,在服务器上保存一段时间的私密资料,如"账号密码"等等.

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

    上述所说的Cookie与Session,是共通性的"东西",不限于语言和框架.



    Django中操作Session


    获取、设置、删除Session中的数据:

    def test(request):
        """设置键值对"""
        request.session['user'] = 'zyk'  # 设置键值对{'user': 'zyk'}
        request.session.setdefault('pwd', '123')  # 设置键值对{'pwd': '123'}, 如果存在则不设置
    
        """获取键值对"""
        user = request.session['user']  # 获取'user'的值
        pwd = request.session.get('pwd', None)  # 获取'pwd'的值, 如果不存在则返回None
    
        """删除键值对"""
        del request.session['user', 'pwd']  # 删除指定的键值对cookie
        # request.session.delete()  # 删除该用户的所有session, 不删除cookie
        # request.session.flush()  # 删除该用户的所有session, 删除cookie
        return HttpResponse('is ok')
    

    获取所有键、值、键值对:

    def test(request):
        """设置键值对"""
        request.session['user'] = 'zyk'  # 设置键值对{'user': 'zyk'}
        request.session.setdefault('pwd', '123')  # 设置键值对{'pwd': '123'}, 如果存在则不设置
    
        """获取所有键、值、键值对"""
        keys = request.session.keys()  # dict_keys(['user', 'pwd'])
        values = request.session.values()  # dict_values(['zyk', '123'])
        items = request.session.items()  # dict_items([('user', 'zyk'), ('pwd', '123')])
        
    	return HttpResponse('is ok')
    

    操作会话的session:

    def test(request):
        """设置键值对"""
        request.session['user'] = 'zyk'  # 设置键值对{'user': 'zyk'}
        request.session.setdefault('pwd', '123')  # 设置键值对{'pwd': '123'}, 如果存在则不设置
    
        """会话session的key"""
        session_key = request.session.session_key  # liucwhvkrccdsgkcibvyu4ar5c56ssw1, 如果不存在则返回None
    
        """检查会话session的key在数据库中是否存在"""
        ret = request.session.exists(session_key)  # 存在返回True, 否则False
    
        """将所有Session失效日期小于当前日期的数据删除"""
        request.session.clear_expired()
    
        """删除当前会话的所有Session数据(不会删除键值对)"""
        request.session.delete()
    
        """删除当前会话数据并删除会话的Cookie(会删除键值对)"""
        request.session.flush()
        # 这用于确保前面的会话数据不可以再次被用户的浏览器访问.
        # 例如, django,contrib.auth.logout()函数中就会调用它.
    
        return HttpResponse('is ok')
    

    设置会话session与Cookie的超时时间:

    def test(request):
        """设置键值对"""
        request.session['user'] = 'zyk'  # 设置键值对{'user': 'zyk'}
        request.session.setdefault('pwd', '123')  # 设置键值对{'pwd': '123'}, 如果存在则不设置
    
    	"""设置会话Session和Cookie的超时时间"""
        value = 0
        request.session.set_expiry(0)
        # 如果value是个整数, session会在value秒后失效;
        # 如果value是个datatime或timedelta, session会在这个时间后失效;
        # 如果value是0, 用户关闭浏览器后session就会失效;
        # 如果Value是None, session会依赖全局session失效策略.
    	# 默认超时时间为两周: SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
    	
        # 设置超时时间后(非None), 可通过获取键值对获得失效时间('_session_expiry', 1):
        items = request.session.items()  # dict_items([('user', 'zyk'), ('pwd', '123'), ('_session_expiry', 1)])
    
        return HttpResponse('is ok')
    

    Session流程解析:
    在这里插入图片描述


    Session版登陆验证:

    # 装饰器函数
    def login_request(fn):
        """如果未登陆,将返回login页面"""
        def inner(request, *args, **kwargs):
            if request.session.get('is_login') != '1':
                # 获取当前url路径
                next = request.path_info
                return redirect('/login/?next=%s' % next)
            ret = fn(request, *args, **kwargs)
            return ret
        return inner
    
    
    # 登陆功能
    def login(request):
        if request.method == 'POST':
            user, pwd = request.POST.get('user'), request.POST.get('pwd')
            if models.Userinfo.objects.filter(name=user, pwd=pwd):
                # 设置session
                request.session['is_login'] = '1'
                # 设置session超时时间,0:关闭浏览器时失效
                request.session.set_expiry(0)
                next = request.GET.get('next')
                ret = redirect(next) if next else redirect('/index/')
                return ret
        return render(request, 'login.html')
    
    
    @login_request
    def home(request):
        return HttpResponse("我是home页面")
    
    
    # @login_request
    def index(request):
        # 获取session的key
        # session_key = request.session.session_key
        return render(request, 'index.html')
    
    
    @login_request
    def logout(request):
        # 删除当前会话数据并删除会话的Cookie
        request.session.flush()
        return redirect('/login/')
    

    Django中Session配置:
    Django中默认支持Session,其内部提供了5种类型的Session供开发者使用.

    Django中Session相关配置:

    1. 数据库Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
    
    2. 缓存Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
    
    3. 文件Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
    SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 
    
    4. 缓存+数据库
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎
    
    5. 加密Cookie Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎
    
    其他公用设置项:
    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,默认修改之后才保存(默认)
    
  • 相关阅读:
    移除TDE
    SQL Server 聚集索引和非聚集索引的区别
    Serivce Broker 简单实用
    SQL Server 2012 ColumnStore索引测试
    UISegmentedControl的所有操作总结
    iPhone开发之深入浅出 — ARC之前世今生(三)
    什么是 ARC?ios5,xcode 4.2
    Present ViewController详解
    UITextField的总结
    iPhone开发资料之内存管理 ,循环引用导致的内存问题
  • 原文地址:https://www.cnblogs.com/zyk01/p/10176320.html
Copyright © 2020-2023  润新知