Django框架07 /cookie和session

Django框架07 /cookie和session

1. django请求生命周期

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

示例:博客系统javascript

  1. 基本实现用户登陆html

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

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

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

    • 获取Cookieweb

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

      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获取(不是绝对,底层抓包能够获取到也能够被覆盖)
    • 删除Cookiechrome

      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操做cookiedjango

    • 操做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')