• Django框架07 /cookie和session


    Django框架07 /cookie和session

    1. django请求生命周期

    • 浏览器上输入http://www.xxx.com 请求到达django后发生了什么? (还有中间件,此处没写)
    • web服务网关接口:wsgi、uwsgi

    示例:博客系统

    1. 基本实现用户登录

    2. 用户未登录就不能访问指定页面

      • 会话
        • 客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应。
      • 基于cookie实现
        • 保存在用户浏览器端的键值对,向服务端发请求时会自动携带。保存在用户浏览器端的键值对,向服务端发请求时会自动携带。
    3. 后端操作cookie

      • 清除chrome浏览器页面缓存和cookie:Ctrl + Shift + del

      • 获取Cookie

        request.COOKIES['key']
        request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
        
        # 参数:
        # default: 默认值
        # salt: 加密盐
        # max_age: 后台控制过期时间
        
      • 设置Cookie

        rep = HttpResponse(...)
        rep = render(request, ...)
        
        rep.set_cookie(key,value,...)
        rep.set_signed_cookie(key,value,salt='加密盐', max_age=None, ...)
        
        # 参数:
        # key, 键
        # value='', 值
        # max_age=None, 超时时间
        # expires=None, 超时时间,值是一个datetime类型的时间日期对象,到这个日期就失效的意思
        # path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
        # domain=None, Cookie生效的域名
        # secure=False, https传输
        # httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
        
      • 删除Cookie

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

        def login(request):
        	# return HttpResponse('...')
            # return render('...')
            # return redirect('...')
            # 设置cookie
            data = redirect('...')
            data.set_cookie()
            # 读取cookie
            request.COOKIES.get('xx')
            return data
        
        # 三个参数:
          key, value='', max_age=None
        
    4. jquery操作cookie

      • 操作cookie前准备

        1.定义:让网站服务器把少量数据储存到客户端的硬盘或内存,从客户端的硬盘读取数据的一种技术;
        
        2.下载与引入:jquery.cookie.js基于jquery;先引入jquery,再引入:jquery.cookie.js;下载:http://plugins.jquery.com/cookie/
        
        3.<script type="text/javascript" src="js/jquery.min.js"></script>
          <script type="text/javascript" src="js/jquery.cookie.js"></script>
        
      • 添加cookie

        // 1.添加一个"会话cookie"
        $.cookie('the_cookie', 'the_value');
        
        //这里没有指明 cookie有效时间,所创建的cookie有效期默认到用户关闭浏览器为止,所以被称为 “会话cookie(session cookie)”。
        
        // 2.创建一个cookie并设置有效时间为 7天
        $.cookie('the_cookie', 'the_value', { expires: 7 });
        
        //这里指明了cookie有效时间,所创建的cookie被称为“持久 cookie (persistent cookie)”。注意单位是:天;
        
        // 3.创建一个cookie并设置 cookie的有效路径
        $.cookie('the_cookie', 'the_value', { expires: 7, path: '/' });
        
        //在默认情况下,只有设置 cookie的网页才能读取该 cookie。如果想让一个页面读取另一个页面设置的cookie,必须设置cookie的路径。cookie的路径用于设置能够读取 cookie的顶级目录。将这个路径设置为网站的根目录,可以让所有网页都能互相读取 cookie (一般不要这样设置,防止出现冲突)。
        
      • 读取cookie

        $.cookie('the_cookie');
        
      • 删除cookie

        $.cookie('the_cookie', null);   //通过传递null作为cookie的值即可
        
      • 可选参数

        $.cookie('the_cookie','the_value',{
            expires:7, 
            path:'/',
            domain:'jquery.com',
            secure:true
        }) 
        
        // expires:(Number|Date)有效期;设置一个整数时,单位是天;也可以设置一个日期对象作为Cookie的过期日期;
        // path:(String)创建该Cookie的页面路径;
        // domain:(String)创建该Cookie的页面域名;
        // secure:(Booblean)如果设为true,那么此Cookie的传输会要求一个安全协议,例如:HTTPS;
        
      • 注意点

        // js操作
        document.cookie = 'k1=liu;path=/'
        // jquery操作
        $.cookie('k1','liu',{path:'/'})
        // 注意:path不同会导致设置不同.
        
        //path的作用
        //    / , 当前网站中所有的URL都能读取到此值.
        //    "",只能在当前页面访问的到此数据.
        //    /index/ ,只能在/index/xxx 的网页中查看.
            
        // 在浏览器操作cookie是路径path不写默认是""    
        

    3. session

    1. 基于session实现保留会话信息 / 推荐

    2. 什么是session

      依赖cookie 
      是一种存储数据的方式,依赖于cookie,实现本质:
          用户向服务端发送请求,服务端做两件事:
              1.生成随机字符串;
              2.为此用户开辟一个独立的空间来存放当前用户独有的值.    
              在空间中如何想要设置值:
                  request.session['x1'] = 123
                  request.session['x2'] = 456
              在空间中取值:
                  request.session['x2']
                  request.session.get('x2')
                  视图函数中的业务操作处理完毕,给用户响应,在响应时会将随机字符串存储到用户浏览器的cookie中. 
      
    3. cookie和session的区别

      答: cookie是存储在客户端浏览器上的键值对,发送请求时浏览器会自动携带. session是一种存储数据方式,基于cookie 实现,将数据存储在服务端(django默认存储到数据库).其本质是:
           用户向服务端发送请求,服务端做两件事:生成随机字符串;为此用户开辟一个独立的空间来存放当前用户独有的值.
              在空间中如何想要设置值:
                  request.session['x1'] = 123
                  request.session['x2'] = 456
              在空间中取值:
                  request.session['x2']
                  request.session.get('x2')
                  视图函数中的业务操作处理完毕,给用户响应,在响应时会 将随机字符串存储到用户浏览器的cookie中.
      
    4. django中session相关的配置 / 拓展

      1.SESSION_COOKIE_NAME = "sessionid"  # Session的cookie保存在浏览器上时的key,即: sessionid=随机字符串
      
      2.SESSION_COOKIE_DOMAIN = None  # api.baidu.com /www.baidu.com/ xxx.baidu.com
      
      3.SESSION_COOKIE_PATH = "/"  # Session的cookie 保存的路径
      
      4.SESSION_COOKIE_HTTPONLY = True  # 是否 Session的cookie只支持http传输,js获取不到
      
      5.SESSION_COOKIE_AGE = 1209600  # Session的 cookie失效日期(2周)
      
      6.SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期
      
      7.SESSION_SAVE_EVERY_REQUEST = False  # 是否每次请求都保存Session,默认修改之后才保存
      
      
      # django中的session如何设置过期时间?
      SESSION_COOKIE_AGE = 1209600  # Session的cookie失效日期(2周)
      
    5. django的session默认存储在数据库,可以放在其他地方吗

      • 小系统:默认放在数据库即可.
      • 大系统:缓存(redis)
      • 放在文件中配置
      SESSION_ENGINE = 'django.contrib.sessions.backends.file' 
      SESSION_FILE_PATH = '/sessiondata/'
      
      • 缓存(内存)
      SESSION_ENGINE = 
      'django.contrib.sessions.backends.cache' 
      SESSION_CACHE_ALIAS = 'default'
      CACHES = {    
      	'default': {        
      		'BACKEND': 'django.core.cache.backends.locmem.LocMem Cache',        
      		'LOCATION': 'unique-snowflake',    
      	} 
      }
      
      • 缓存(redis)
      SESSION_ENGINE = 
      'django.contrib.sessions.backends.cache' 
      SESSION_CACHE_ALIAS = 'default' 
      CACHES = {    
          default": {        
          "BACKEND": "django_redis.cache.RedisCache",        
          "LOCATION": "redis://127.0.0.1:6379",        
          "OPTIONS": {            
              "CLIENT_CLASS": "django_redis.client.DefaultClient", 
              "CONNECTION_POOL_KWARGS": {"max_connections": 100}           
              # "PASSWORD": "密码",        
          	}    
      	} 
      }
      
    6. 操作session

      # 设置(添加&修改) 
      request.session['x1'] = 123 
      request.session['x2'] = 456
      
      # 读取 
      request.session['xx'] 
      request.session.get('xx')
      
      # 删除 
      del request.session['xx']
      # 删除当前会话的所有Session数据
      request.session.delete()
      # 删除cookie以及session
      request.session.flush()
      
      request.session.keys() 
      request.session.values() 
      request.session.items()
      request.session.session_key   # 获取sessionid的值
      request.session.set_expiry(value) 	# 设置会话Session和Cookie的超时时间
      # 如果value是个整数,session会在些秒数后失效。
      # 如果value是个datatime或timedelta,session就会在这个时间后失效。
      # 如果value是0,用户关闭浏览器session就会失效。
      # 如果value是None,session会依赖全局session失效策略。
      

    4. 总结

    • cookie/session的应用场景

      • 用户认证
      • 投票
      • 短信验证过期
      • 权限管理
    • session中的数据是根据用户相互隔离.

      # 示例 
      def login(request):    
          # 获取用户提交的用户名和密码    
          user = request.POST.get('user')    
          request.session['user_name'] = user     
      def index(request):    
          print(request.session['user_name'])
      
    • cookie代码示例

      from django.shortcuts import render,redirect
      from app01 import models
      
      def login(request):
          """
          用户登录
          :param request:
          :return:
          """
          if request.method == 'GET':
              return render(request, 'login.html')
      
          # 获取用户提交的用户名和密码
          user = request.POST.get('user')
          pwd = request.POST.get('pwd')
      
          # 去数据库检查用户名密码是否正确的两种方式
          # user_object = models.UserInfo.objects.filter(username=user,password=pwd).first()
          # user_object = models.UserInfo.objects.filter(username=user, password=pwd).exists()
          
          user_object = models.UserInfo.objects.filter(username=user, password=pwd).first()
      
          if user_object:
              # 用户登录成功
              result = redirect('/index/')
              result.set_cookie('xxxxxxxx',user)
              return result
      
          # 用户名或密码输入错误
          return render(request,'login.html',{'error':'用户名或密码错误'})
      
      
      def index(request):
          """
          博客后台首页
          :param request:
          :return:
          """
          user = request.COOKIES.get('xxxxxxxx')
          if not user:
              return redirect('/login/')
      
          return render(request,'index.html',{'user':user})
      
    • session代码示例

      from django.shortcuts import render,redirect
      
      from app01 import models
      
      def login(request):
          '''
          用户登陆
          :param request:
          :return:
          '''
          if request.method == 'GET':
              return render(request,'login.html')
          user = request.POST.get('username')
          pwd = request.POST.get('password')
          ret = models.UserInfo.objects.filter(username=user,password=pwd).first()
          if ret:
              request.session['user_name'] = ret.username
              return redirect('/index/')
          return render(request,'login.html',{'error':'用户名或密码错误'})
      
      #构建装饰器
      import functools
      def auth(f):
          @functools.wraps(f)
          def inner(request,*args,**kwargs):
              user = request.session.get('user_name')
              if not user:
                  return redirect('/login/')
              return f(request,*args,**kwargs)
          return inner
      
      @auth
      def index(request):
          '''
          博客后台首页
          :param request:
          :return:
          '''
          return render(request,'index.html')
      
  • 相关阅读:
    百度地图(8)-图层
    百度地图(7)-点聚合
    百度地图(6)-信息窗口
    鸟哥学习笔记二(基础篇第七章)
    鸟哥学习笔记一(基础篇第六章)
    sql server学习笔记二
    sql server学习笔记一
    centos下sudo命令不能使用
    CentOS系统时间与现在时间相差8小时解决方法
    SUID GUID详解
  • 原文地址:https://www.cnblogs.com/liubing8/p/11643340.html
Copyright © 2020-2023  润新知