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')
相關文章
相關標籤/搜索