zoukankan      html  css  js  c++  java
  • Django框架(十六)—— cookie和session组件

    cookie和session组件

    一、cookie

    1、cookie的由来

    HTTP协议是无状态的。无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。

    客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样一个场景下诞生。

    2、什么是cookie

    存储在客户端浏览器上的键值对。

    随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。 Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!

    3、cookie的原理

    是服务器产生,发给客户端浏览器,浏览器保存起来,下次发请求,会携带这个键值对到服务器

    4、cookie的覆盖

    如果服务器端发送重复的Cookie那么会覆盖原有的Cookie,例如客户端的第一个请求服务器端发送的Cookie是:Set-Cookie: a=A;第二请求服务器端发送的是:Set-Cookie: a=AA,那么客户端只留下一个Cookie,即:a=AA。

    5、在浏览器中查看cookie

    浏览器中按F12,点network---cookies就能看到

    6、cookie的使用

    (1)基本语法

    # 写cookie:在Httpresponse这个对象上写
    	obj = HttpResponse('ok')
    	obj.set_cookie(key,value)
    # 取cookie:从request对象中取,取出来是个字典request.COOKIES
        request.COOKIES.get('is_login')
    # 删除cookie:
    	obj.delete_cookie('name')
    

    (2)登录认证

    def login_auth(func):
        def inner(request, *args, **kwargs):
            # 拿到之前访问的路径
            # 这个不行,因为取不到数据部分
            # url=request.path
            url = request.get_full_path()
    
            is_login = request.COOKIES.get('is_login')
            if is_login:
                res = func(request, *args, **kwargs)
                return res
            else:
                return redirect('/login/?next=%s' % url)
            return inner
    
    @login_auth
    def order(request):
        return HttpResponse('我是订单页面,我得登录才能看')
    

    7、cookie加盐

    def salt_cookie(request):
        object = HttpResponse('ok')
        # 加盐,123是个密码,解cookie的时候需要它,
        object.set_signed_cookie('name','lqz',salt='123')
        object.set_signed_cookie('name','lqz',salt='123',)
        # max_age,5秒之后失效,三天失效
        object.set_cookie('name','lqz',max_age=60*60*24*3)
        # path,只有访问shopping的时候,才会携带cookie过来
        object.set_cookie('name', 'lqz', path='/shopping/')
        object.set_cookie('name', 'lqz')
        return object
    

    加盐的其他属性

    domain    设置域名下有效domain='map.baidu.com'
    expires     超时时间,传一个datatime对象
    secure=False       (默认是false,设置成True浏览器将通过HTTPS来回传cookie)
    httponly=True   只能https协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
    
    

    二、session

    1、什么是session

    解决cookie不安全的问题

    • 存在服务器上的键值对{'sdaf随机字符串':{name:lqz,pwd:123}}
    • 用session必须跟cookie连用

    2、session的使用

    # 设置值
    request.session['name']='lqz'
    # 如果设置多个,它会以字典的形式存储到session表中的session_data中
    
    # 生成session时:
        	1.生成随机字符串:dfasfasdfa
            2.取数据库存储
            3.写入cookie(set_cookie('sessionid','dfasfasdfa'))
    # 取值
    name=request.session['name']
    -执行流程:
       -取到cookie的随机字符串
       -取session表中根据随机字符串查询,查询出session_data这个字典,然后把字典中name返回
    
    # 删除值
    # 取出cookie,随机字符串,去数据库删除随机字符串是当前值的记录
    request.session.delete()
    
    # 既删除cookie,又删除数据库
    request.session.flush()
    
    def set_session(request):
        # 写session,干了三件事(每个浏览器会生成一个随机字符串)
        	# 1 生成随机字符串:dfasfasdfa
    		# 2 去数据库存储
    	    # 	随机字符串         值  (字典形式)                       超时时间
    	    # 	dfasfasdfa   {'name':'lqz','age':18,'sex':'男'}       超时时间
    		# 3 写入cookie(set_cookie('sessionid','dfasfasdfa'))
        # 随机字符串是跟浏览器相关的,数据是跟账号相关的
        request.session['name'] = 'lqz'
    

    3、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,默认修改之后才保存(默认)
    

    三、CBV中加装饰器

    from django import views
    from django.utils.decorators import method_decorator
    # @method_decorator(login_auth,name='get')
    # @method_decorator(login_auth,name='post')
    class UserList(views.View):
        # @method_decorator(login_auth)
        def dispatch(self, request, *args, **kwargs):
            obj=super().dispatch(request, *args, **kwargs)
            return obj
    
        @method_decorator(login_auth)
        def get(self,request):
            return HttpResponse('我是用户列表')
    
        def post(self,request):
            return HttpResponse('我是用户列表')
    
  • 相关阅读:
    LeetCode 1110. Delete Nodes And Return Forest
    LeetCode 473. Matchsticks to Square
    LeetCode 886. Possible Bipartition
    LeetCode 737. Sentence Similarity II
    LeetCode 734. Sentence Similarity
    LeetCode 491. Increasing Subsequences
    LeetCode 1020. Number of Enclaves
    LeetCode 531. Lonely Pixel I
    LeetCode 1091. Shortest Path in Binary Matrix
    LeetCode 590. N-ary Tree Postorder Traversal
  • 原文地址:https://www.cnblogs.com/linagcheng/p/10015950.html
Copyright © 2011-2022 走看看