zoukankan      html  css  js  c++  java
  • 【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,默认修改之后才保存(默认)
    
  • 相关阅读:
    OSPF
    【今日CS 视觉论文速览】 24 Jan 2019
    【今日CS 视觉论文速览】Wed, 23 Jan 2019
    【今日CS 视觉论文速览】 21 Jan 2019
    【Processing学习笔记】安装与入门
    【今日CS 视觉论文速览】Part2, 18 Jan 2019
    【今日CS 视觉论文速览】Fri, 18 Jan 2019
    【今日CS 视觉论文速览】Thu, 17 Jan 2019
    【今日CS 视觉论文速览】Part2, 16 Jan 2019
    【今日CS 视觉论文速览】Wed, 16 Jan 2019
  • 原文地址:https://www.cnblogs.com/zyk01/p/10176320.html
Copyright © 2011-2022 走看看