Django中的cookie和session

不要花裏胡哨,直接乾貨!!

  • 定義:
    • 保存在瀏覽器本地上一組組鍵值對
    • 不是python中都獨有的
  • 特色:
    1. 由服務器讓瀏覽器進行設置的
    2. 瀏覽器把cookie保存在在瀏覽器本地
    3. 下次從新訪問時自動攜帶該cookie信息
  • 應用:
    1. 登陸驗證
    2. 保存瀏覽器設置習慣
    3. 存儲簡單的信息
  • django中設置cookiepython

    • 經過response 對象設置sql

      ret= redirect('/index')
      ret.set_cookie(key,value)  #在響應頭中是--  set-cookie:key=value
    • 設置加密cookie數據庫

      ret.set_signed_cookie(key,value,salt='加密鹽',...)
    • 參數:django

      • key, 鍵瀏覽器

      • value='', 值緩存

      • max_age=None, 超時時間(默認是None,關閉瀏覽器cookie失效)安全

        ret.set_signed_cookie('is_login', '1', 's21',max_age=10000,)
      • path='/', Cookie生效的路徑,/ 表示根路徑,特殊的:根路徑的cookie能夠被任何url的頁面訪問服務器

      • domain=None, Cookie生效的域名cookie

      • secure=False, https傳輸 狀態爲True時,只能http傳輸session

  • django中獲取cookie

    • get方法獲取

      #獲取未加密cookie
      request.COOKIES.get('key')  
      #獲取加密cookie
      is_login = request.get_signed_cookie('is_login', salt='s21', default='')
  • 刪除cookie

    • rep.delete_cookie("user") # 刪除用戶瀏覽器上以前設置的user的cookie值
    def logout(request):
        ret = redirect("/login/")
        ret.delete_cookie("user")  # 刪除用戶瀏覽器上以前設置的user的cookie值
        return rep

2.session

  • 定義:
    • 保存在服務器上的一組組鍵值對(session超時時間默認是14天)
  • 爲何存在session:
    • cookie保存在瀏覽器本地不安全
    • cookie數量大小都受到必定限制
  • session流程分析

    • 在瀏覽器(用戶)首次請求(登錄)時沒有cookie, 服務器會根據用戶信息設置一個session表,記錄用戶狀態,值等相關數據;session表中有字段session_key,session_data,和超時時間exprie_data
    • 在服務器響應時,會把session表中的session_key以鍵值對session_id:xxxxxx的形式放到cookie中
    • 下次瀏覽器再次訪問時,會攜帶含有session_id信息的cookie,而後服務器根據session_id去尋找該用戶記錄的session_data
    • 因此session不能單獨存在,必須依賴cookie使用!
  • 運用
    • django默認把session放在一張數據表中
    • 在pycharm中把項目目錄裏的db.sqlite3拖到右側數據庫管理中,執行數據遷移命令python manage.py maration,生成表django session
  • 具體操做

    • expried過時
    #設置session,當作字典的鍵值對
    request.session[key]  = value
    #獲取session
    is_login = request.session.get(key)  
    
    #獲取數據庫中的session_key(瞭解)
    request.session.session_key
    
    # 將全部Session失效日期小於當前日期的數據刪除
    request.session.clear_expired()
    
    # 檢查會話session的key在數據庫中是否存在
    request.session.exists("session_key")
    
    # 刪除當前會話的全部Session數據,不會刪除cookie
    request.session.delete()
      
    # 刪除當前的會話數據並刪除會話的Cookie。
    request.session.flush() 
        這用於確保前面的會話數據不能夠再次被用戶的瀏覽器訪問
        例如,django.contrib.auth.logout() 函數中就會調用它。
    
    # 設置會話Session和Cookie的超時時間
    request.session.set_expiry(value)
      * 若是value是個整數,session會在些秒數後失效。
        * 若是value是個datatime或timedelta,session就會在這個時間後失效。
        * 若是value是0,用戶關閉瀏覽器session就會失效。
        * 若是value是None,session會依賴全局session失效策略。
  • django中的session配置(記住最好)

    1. 數據庫Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默認)
    
    2. 緩存Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default'                            # 使用的緩存別名(默認內存緩存,也能夠是memcache),此處別名依賴緩存的設置
    
    3. 文件Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
    SESSION_FILE_PATH = None                                    # 緩存文件路徑,若是爲None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir() 
    
    4. 緩存+數據庫
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎
    
    5. 加密Cookie Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎
    
    其餘公用設置項:
    SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認)
    SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路徑(默認)
    SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默認)
    SESSION_COOKIE_SECURE = False                            # 是否Https傳輸cookie(默認)
    SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http傳輸(默認)
    SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默認)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否關閉瀏覽器使得Session過時(默認)
    SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次請求都保存Session,默認修改以後才保存(默認)
    • from django.conf import global_settings
      • 配置都在全局配置中
相關文章
相關標籤/搜索