• django框架进阶cookie和session长期维护


    ###############    python基础回顾:装饰器    ################

    # 装饰器非常重要,1是写代码的时候,2是面试的时候,没有python开发不问装饰器的,
    # 装饰器绕不过去,一定会用到,不会装饰器不要说会python,
    # 理解Python装饰器(Decorator)
    # 想要理解Python中的装饰器,不得不先理解闭包(closure)这一概念。
    # 闭包:
    # 就是一个函数里面又套上另一个函数的定义,你反而要用的是内部函数,而且内部函数会用到外部函数的变量,这种方式我们就成为闭包,
    # 我们把外部函数的变量和内部函数这个整体,我们称之为闭包,
    
    # 开放封闭原则:
    # 写代码需要遵循开放封闭原则,简单来说就是,他规定已经实现的代码功能不允许被修改,但是可以被扩展,
    # 封闭:已实现的功能
    # 开放:对封闭的代码进行拓展开发,
    # 为什么已经实现的代码不允许被修改?因为这个代码可能很多地方都用到了,你改动了会影响一大片,
    # 所以使用装饰器,在不影响原有代码的基础上,动态的给函数加功能,但是要么在函数之前做事情,要么在函数之后做事情,不能在函数之中做事情
    
    # 装饰器的应用:
    # 可以用来计算程序执行的时间
    # 可以用来做加验证,

    下面使用装饰器的思想来实现登陆的校验功能:

    ###############    django-cookie的操作    ################

    # cookie是什么?
    # 举例说明,如果是登陆页面和首页页面
    # 场景:用户登录,然后去访问首页,在访问首页的时候你怎么知道他有没有登录呢?
    # cookie的由来,
    # 因为HTTP请求是没有状态的,每一次请求都是独立的,你下次访问首页,我没有办法判断你是否登陆了
    # cookie是什么?
    # cookie就是保存在浏览器上的键值对,(不能说cookie就是做登陆的)
    # 客户登陆之后,服务端会有一个响应,这个响应是浏览器拿到的,
    # 你可以让浏览器收到响应之后在本地保存键值对,你只要不清除这个cookie,下一次请求的时候就会自动携带cookie值,
    # 服务端就可以拿到这个键值对,就可以判断是否登陆了,
    
    # cookie的应用:
    # cookie不只是能用来做登陆,可以做很多很多的事情,
    # 1,可以做登, 7天免登录
    # 2,记录用户的浏览器的习惯,
    # 3,简单的投票限制,
    # cookie是服务端设置的, 我们浏览器可以不让服务端设置记录cookie(可以禁用cookie,),
    # 现在基本所有的网站登陆都要使用到cookie,
    # cookie默认是关闭浏览器就失效了,
    
    # cookie的使用:
    # 有很多页面都需要校验是否登陆,所以使用装饰器来做登陆的校验,
    # 装饰器就是给函数动态的加功能
    # cookie可能不够安全,因为当你使用cookie传递一些隐私信息的时候,可以通过抓包等工具截取到,
    # 一般企业里面还是用的session多,

    代码:

    from django.shortcuts import render,redirect
    from django.views.decorators.csrf import csrf_exempt, csrf_protect
    
    
    def check_cookie(func):  # # 装饰器本身还是一个函数,func是把被装饰的函数做为参数传入,
        print('进入装饰器')
    
        def wrapper(request,*args,**kwargs):  
         # wrapper 有包装的意思,这个地方的作用是说,运行装饰器的时候需要做什么事情,里面的参数是被装饰函数的参数,由于不知道被调用参数的个数,使用不定长参数 # cookie_info=request.COOKIES.get('is_login') cookie_info =request.get_signed_cookie('is_login',salt='SOS',default=0) # 没有获取到值会报错,所以需要一个default print(cookie_info) if cookie_info == '1': return func(request,*args,**kwargs) # 这个返回值,就是去调用被装饰函数去了(携带不定长参数) else: return redirect('/login/') return wrapper @csrf_exempt def login(request): if request.method=='POST': user=request.POST.get('user') pwd=request.POST.get('pwd') if user=='liqian' and pwd =='123': ret = redirect('/home/') # ret.set_cookie('is_login',1) # 明文 ret.set_signed_cookie('is_login',value=1,salt='SOS',max_age=10) # 加密 return ret return render(request,'login.html') # 调用装饰器使用@语法 @check_cookie def home(request): return render(request, 'home.html') def logout(request): # 如何删除cookie ret = redirect('/login/') ret.delete_cookie('is_login') return ret

    ###############    django-session的操作    ################

    # session
    # Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,
    # 因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是Session。
    # session的格式是键值对,但是值是在服务端,
    # 还需要cookie记录下来键在浏览器上,
    # K1:{is_login: 1, user: xiaohei}
    # K2:{is_login: 1, user: xiaowang}
    # 这是session,
    # session是依赖于cookie的,
    # 所以需要定义一个cookie,存储值服务器:比如:XX:k1,
    # 服务器拿到K1之后,然后在服务端查询就可以了,
    #
    # session是什么?
    # 是保存在服务端的的键值对,
    
    # django中session做的事?
    # qewrqerqe:{is_login: 1, user: xiaohei}
    # werwewerwr:{is_login: 1, user: xiaowang}
    # 存session
    # 1,在服务端生成随机字符串,就是session的key
    # 2,生成和上面的随机字符串对应的一个大字典,用来保存用户的信息,就是把session的key作为cookie键值对的值,
    # 3,把随机字符串当成cookie返回给浏览器,sessionid:存在服务器端的session的key
    
    # 取session:
    # 1,从请求携带的cookie里面找到随机字符串,
    # 2,拿到随机字符串去session中找对应的大字典,
    # 3,从大字典中根据key取值,
    
    # session的优势:
    # 1,比cookie存的数据多
    # 2,安全性好,数据都保持在服务端,
    # session的缺点,
    # 1,因为每一个人都需要一个session,像淘宝那样的,数据量比较大,会占用一些资源,
    
    
    # 设置会话Session和Cookie的超时时间
    # request.session.set_expiry(value)
    # *如果value是个整数,session会在些秒数后失效。
    # *如果value是个datatime或timedelta,session就会在这个时间后失效。
    # *如果value是0, 用户关闭浏览器session就会失效。
    # *如果value是None, session会依赖全局session失效策略。
    # 这个失效,是cookie失效,数据库里面的session数据还在
    # 如果想要将所有Session失效日期小于当前日期的数据删除
    # request.session.clear_expired()

    代码:

    from django.shortcuts import render,redirect
    from django.views.decorators.csrf import csrf_exempt, csrf_protect
    
    
    def check_session(func):
        print('进入装饰器')
        def wrapper(request,*args,**kwargs):
            session_info=request.session.get('is_login')
            print(session_info)
            if session_info=='1':
                return func(request,*args,**kwargs)
            else:
                return redirect('/login/')
        return wrapper
    
    
    @csrf_exempt
    def login(request):
        if request.method=='POST':
            user=request.POST.get('user')
            pwd=request.POST.get('pwd')
            if user=='liqian' and pwd =='123':
                ret = redirect('/home/')
                request.session['is_login'] = '1'
                request.session.set_expiry(7)  # 7秒失效,
                # session数据是需要保持到数据库的,这个使用orm,django会自动创建的,django_session, 
                # 一个浏览器请求会在数据库生成一个session,两个就会生成两个,不会覆盖,---
                # session默认是存在数据库的,但是也是可以存在缓存中的,比如Redis缓存, 这个可以在setting中配置,
                # 每一次和服务器交互会更新过期时间的,这样有交互过期时间就会延后,
                return ret
        return render(request,'login.html')
    
    
    @check_session
    def home(request):
        return render(request, 'home.html')
    
    
    def logout(request):
        # 如何清除session
        request.session.flush()  # 这一步会删除session,并且cookie也删除了,
        # request.session.delete() #这种只删除是session,这种cookie还在,但是是无效的,这种不常用,
        return redirect('/login/')

    ################################################

    ################################################

    ################################################

  • 相关阅读:
    常用git命令
    复制文件
    实现斗地主洗牌、发牌、看牌
    线程池实现多线程
    git无法提交问题
    Js中处理日期加减天数
    form详解
    node.js中exports与module.exports的区别
    css的direction属性
    webstorm基础使用
  • 原文地址:https://www.cnblogs.com/andy0816/p/12293716.html
Copyright © 2020-2023  润新知