zoukankan      html  css  js  c++  java
  • day_58

    cookie与session原理

    ​ 为什么会有这些技术
    ​ 1.目的是为了保存客户端的用户状态
    ​ 2.原因:HTTP协议是无状态的

    ​ 保存在客户端浏览器上的键值对
    ​ cookie虽然是保存在客户端浏览器上的键值对 但它是由服务端设置的
    ​ 浏览器有权禁止cookie写入

    ​ token 加密字符串
    ​ 加密算法 xxx

    ​ username >> (xxx) >> 随即字符串

    django操作cookie
    小白必会三板斧

    obj = HttpResponse()
    # 利用obj对象你才可以操作cookie
    return obj
    
    obj = render()
    return obj
    
    obj = redirect()
    return obj
    

    如何设置cookie

    obj.set_cookie('k1','v1')  # 告诉浏览器设置
    

    如何获取cookie

    request.COOKIES.get('k1')  # 获取浏览器携带过来的cookie值
    

    如何设置cookie的超时时间

    obj.set_cookie('k1','v1',max_age=3)
    obj.set_cookie('k1','v1',expires=3)
    # 两个参数都是设置超时时间	并且都是以秒为单位
    # 区别: 如果你要给IE浏览器设置cookie的超时时间	只能用expires
    

    删除cookie(了解)

    def logout(request):
        rep = redirect("/login/")
        rep.delete_cookie("user")  # 删除用户浏览器之上设置的usercookie值
        return rep
    

    基于cookie实现的登录认证装饰器

    from functools import wraps
    def login_auth(func):
        @wraps(func)
        def inner(request,*args,**kwargs):
            # 判断当前用户是否登录
    
            if request.COOKIES.get('whoami'):
                res = func(request,*args,**kwargs)
                return res
            else:
                target_path = request.path_info # 获取用户想要访问的url
                return redirect('/login/?next=%s'%target_path)  # 将url添加到login后面,方便获取
        return inner
    
    
    def login(request):
        if request.method == "POST":
            username = request.POST.get('username')
            password = request.POST.get('password')
            if username == 'jason' and password== '123':
    
                old_path = request.GET.get('next')
                if old_path:
                    obj = redirect(old_path)  # 登陆成功实现跳转
                else:
                
                     obj = redirect('/home/')
                obj.set_cookie('whoami','jason',max_age=5)
                return obj
        return render(request,'login.html')
    

    session

    ​ 保存在服务端上面的键值对
    ​ session的工作机制是需要依赖于cookie的

    ​ 设置session

    request.session['k1'] = 'v1'
    # 第一次设置的时候会报错	因为你没有执行数据库迁移命令	生成django需要用到的一些默认表(django_session)
    '''
    django默认的session失效时间是14天	2周
    '''
    '''
    上面这句话发生了什么事情?
    	1.django内部自动帮你调用算法生成一个随机的字符串
    	2.在django_session添加数据(数据也是加密处理)
    		随机字符串         加密之后的数据           失效时间
    		ashdjsad            jsadsada
    	3.将产生的随机字符串返回给客户端浏览器	让浏览器保存
    		sessionid:随机字符串
    

    获取sessin

    request.session.get('k1')
    '''
    1.django内部会自动去请求头里面获取cookie
    2.拿着sessionid所对应的随机字符串去django_session表中一一对比
    3.如果比对上了	会将随机字符串对应的数据取出来	自动放入request.session中供程序员调用
    如果没有会是一个空字典
    '''
    

    删除session

    request.session.delete()  # 客户端和服务端都删了
    request.session.flush()  # 推荐使用
    

    设置失效时间

    # 设置会话Session和Cookie的超时时间
    request.session.set_expiry(value)
    * 如果value是个整数,session会在些秒数后失效。
    * 如果value是个datatime或timedelta,session就会在这个时间后失效。
    * 如果value是0,用户关闭浏览器session就会失效。
    * 如果value是None,session会依赖全局session失效策略。
    

    django中间件

    ​ django默认有个中间件
    ​ 并且支持用户自定义中间件 然后暴露给用户五个可以自定义的方法

    ​ django默认有七个中间件
    ​ 只要你想要做一些网站的全局性功能 你都应该考虑使用django的中间件
    ​ 1.全局的用户登录校验
    ​ 2.全局的用户访问频率校验
    ​ 3.全局的用户权限校验() 20行代码 100+ RBAC
    ​ django的中间件是所有框架里面做的最完善的

    需要掌握
    process_request
    1.请求来的时候会按照settings配置文件中从上往下的顺序 依次执行每一个中间件内部定义的process_request方法
    如果中间件内部没有该方法 直接跳过执行下一个中间件

    ​ 2.该方法一旦返回了HttpResponse对象,那么请求会立刻停止往后走 原路立即返回

    ​ process_response
    ​ 1.响应走的时候会按照settings配置文件中从下往上的顺序 依次执行每一个中间件内部定义的process_response方法

    ​ 2.该方法必须有两个形参 并且必须返回response形参 不返回直接报错

    ​ 3.该方法返回什么(HttpResponsed对象) 前端就能获得什么

    注意: 当process_request方法直接返回HttpResponse对象之后 会直接当前中间件的process_respone往回走
    没有执行的中间件都不会再执行

    需要了解
    process_view(self,request,view_name,*args,**kwargs)
    1.路由匹配成功之后执行视图函数之前触发
    2.如果该方法返回了HttpResponse对象 那么会从下往上一次经过每一个中间件里面的process_response方法
    process_template_response
    1.当你返回的对象中含有render属性指向的是一个render方法的时候才会触发 从下往上的顺序

    def mdzz(request):
        print('我是视图函数mdzz')
        def render():
            return HttpResponse('你好呀 我是2B')
        obj = HttpResponse('我很好 好的像个SB一样')
        obj.render = render
        return obj
    

    ​ process_exception
    ​ 1.当视图函数中出现错误 会自动触发 顺序是从下往上
    ​ 上面这五个方法 会在特定的阶段自动触发

  • 相关阅读:
    (转)如何在一台电脑上开启多个tomcat 和配置让系统识别哪个具体的tomcat
    Moccakids-Tangram Puzzle 限免啦!
    iOS:OC Lib:MagicalRecord
    iOS Vuforia:TextReco 增加自己的单词库
    iOS:Tools:快速注释Doxygen
    聊聊分布式事务,再说说解决方案
    .NET Core 事件总线,分布式事务解决方案:CAP
    Glob 模式
    基于 Kong 和 Kubernetes 的 WebApi 多版本解决方案
    ASP.NET Core 身份验证(一)
  • 原文地址:https://www.cnblogs.com/LZF-190903/p/11987109.html
Copyright © 2011-2022 走看看