django會話

django會話

能夠把會話理解爲客戶端與服務器之間的一次會晤,在一次會話過程當中有屢次請求和響應,可是因爲HTTP協議的特性-->無狀態,每次瀏覽器的請求都是無狀態的,沒法保存狀態信息,也就是說後臺服務器不知道當前請求是否和上一次的請求是來自同一個用戶的,試想一下,淘寶京東,沒法識別用戶並保存用戶的狀態是致命的。javascript

1、cookie的原理

爲了保持鏈接狀態,便有了cookie的由來,cookie是存儲在本地服務器上的一個key-value結構的數據,相似於python中的字典,經過cookie除了能夠保存鏈接狀態,還能夠保存用戶信息等數據。java

客戶端發起請求,服務端生成cookie響應瀏覽器,這時客戶端會將cookie保存起來,當下一次訪問服務器的時候會將cookie一塊兒發送給服務器,服務器經過cookie判斷是誰的訪問

注:若是服務端發送重複的cookie,會覆蓋原有的cookiepython

2、django中操做cookie

1.啓用會話

Django經過一個內置中間件來實現會話功能數據庫

編輯settings.py中的MIDDLEWARE設置django

django.contrib.sessions.middleware.SessionMiddlewar

2.配置會話引擎

1. 數據庫Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默認)
而後運行  manage.py migrate  在數據庫內建立sessions表

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,默認修改以後才保存(默認)

3.在視圖中操做cookie

3.1設置cookie

def set_cookie(request):
    obj = HttpResponse('ok')    #obj=render(request,...)
    obj.set_cookie('name', 'ABC')
    # obj.set_signed_cookie(key,value,salt='加密鹽')
    obj.set_signed_cookie('name','lqz',salt='123')#加鹽,123是個密碼,解cookie的時候須要它,
    return obj

參數:瀏覽器

  • key--->鍵
  • value--->值
  • max_age=None--->超時時間,cookie延續的時間,以秒爲單位,
  • 超時時間expires,傳一個datatime對象
  • path='/',能夠設置路徑,設置路徑以後,path='/index/',只有訪問index的時候,纔會攜帶cookie過來
  • domain 設置域名下有效domain='map.baidu.com'
  • secure=False, (默認是false,設置成True瀏覽器將經過HTTPS來回傳cookie)
  • httponly=True 只能https協議傳輸,阻止javascript對會話數據的訪問,提升安全性。(不是絕對,底層抓包能夠獲取到也能夠被覆蓋)

3.2獲取cookie

def get_cookie(request):
    print(type(request.COOKIES))
    # 取cookie的值
    print(request.COOKIES)
    name=request.COOKIES.get('name')
    
    #加鹽,123是個密碼,解cookie的時候須要它,
    # request.get_signed_cookie(key, default=RAISE_ERROR, salt='123', max_age=None)
    
    obj = HttpResponse('get_cookie')
    return obj

3.3刪除cookie

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

3、session

cookie自己保存在客戶端,可能被攔截或竊取,因此網站設計一般將Cookie用來保存一些不重要的內容,實際的用戶數據和狀態仍是以Session會話的方式保存在服務器端。緩存

Session就是在服務器端的‘Cookie’,Session依賴Cookie!安全

給每一個客戶端的Cookie分配一個惟一的id,這樣用戶在訪問時,經過Cookie,服務器就知道來的人是「誰」。而後咱們再根據不一樣的Cookie的id,在服務器上保存一段時間的私密資料,如「帳號密碼」等等。

1.設置session

def set_session(request):
    # 寫session,幹了三件事(每一個瀏覽器會生成一個隨機字符串)
    # 隨機字符串是跟瀏覽器相關的,數據是跟帳號相關的
    request.session['name']='ABC'
    request.session['age']='18'
    request.session['sex']='男'
    
    '''
    非django的步驟(django已經封裝了下面的操做)
    1 生成隨機字符串:dfasfasdfa
    2 去數據庫存儲
        隨機字符串     值  (字典形式)                            超時時間
        dfasfasdfa   {'name':'ABC','age':18,'sex':'男'}       超時時間
    3 寫入set_cookie(set_cookie('sessionid','dfasfasdfa'))  發送給客戶端
    '''
    return HttpResponse('ok')

2.獲取session

def get_session(request):
    # 取session   取name這個字段對應的值
    name=request.session['name']
    
    # 正常流程  非django的步驟(django已經封裝了下面的操做)
    # 去cookie中取出隨機字符串
    # 去session那個表去查詢,取出session_data的數據,解密成字典,而後取name的值返回
    # print(name)

3.刪除session

# 刪除當前會話的全部Session數據(只刪數據庫)
request.session.delete()
  
# 刪除當前的會話數據並刪除會話的Cookie(數據庫和cookie都刪)。
request.session.flush() 
    這用於確保前面的會話數據不能夠再次被用戶的瀏覽器訪問
    例如,django.contrib.auth.logout() 函數中就會調用它。

4、session的相關方法

# 全部 鍵、值、鍵值對
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()

# 會話session的key
request.session.session_key

# 將全部Session失效日期小於當前日期的數據刪除
request.session.clear_expired()

# 檢查會話session的key在數據庫中是否存在
request.session.exists("session_key")

# 設置會話Session和Cookie的超時時間
request.session.set_expiry(value)
    * 若是value是個整數,session會在些秒數後失效。
    * 若是value是個datatime或timedelta,session就會在這個時間後失效。
    * 若是value是0,用戶關閉瀏覽器session就會失效。
    * 若是value是None,session會依賴全局session失效策略。

序列化會話

Django默認使用JSON序列化會話數據。你能夠在SESSION_SERIALIZER設置中自定義序列化格式,甚至寫入警告說明。可是強烈建議你仍是使用JSON,尤爲是以cookie的方式進行會話時。服務器

相關文章
相關標籤/搜索