Django -- Seeion介紹
問: Django的session是什麼?
答: Django 完全支援匿名 Session的。 Session 架構允許每一個使用者儲存并取回資料。它将資料儲存在
伺服器端,并将發送和接收, Cookie的操作包裝起來。在 Cookie 中包含的是 Session ID,而不是資料本身。
好了回到正題,那麼我們來簡單的使用一下Session把.
壹:Seeion的簡單使用
def index(request):
# 擷取、設定、删除Session中資料
request.session['v1']
request.session.get('v1',None)
request.session['v1'] = 123
request.session.setdefault('v1',123) # 存在則不設定
del request.session['v1']
# 所有 鍵、值、鍵值對
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 使用者session的随機字元串
request.session.session_key
# 将所有Session失效日期小于目前日期的資料删除
request.session.clear_expired()
# 檢查 使用者session的随機字元串 在資料庫中是否
request.session.exists("session_key")
# 删除目前使用者的所有Session資料
request.session.delete("session_key")
貳:Session的種類
Django中預設支援Session,其内部提供了5種類型的Session供開發者使用,使用以下的類型隻需要在引擎修改下配置換成相應的類型就可以了。
①資料庫(預設)
②緩存
③檔案
④緩存+資料庫
⑤加密cookie
①資料庫Session
Django預設支援Session,并且預設是将Session資料存儲在資料庫中,即:django_session 表中。
配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(預設)
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,預設修改之後才儲存(預設)

使用
def index(request):
# 擷取、設定、删除Session中資料
request.session['k1'] # 擷取
request.session.get('k1',None)
request.session['k1'] = 123 # 設定
request.session.setdefault('k1',123) # 設定,存在則不設定
del request.session['k1']
# 擷取所有 鍵、值、鍵值對
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 使用者session的随機字元串(存在用戶端浏覽器中,也存在服務端的資料庫中)
request.session.session_key
# 将所有Session失效日期小于目前日期的資料删除
request.session.clear_expired()
# 檢查 使用者session的随機字元串 在資料庫中是否
request.session.exists("session_key")
# 删除目前使用者的所有Session資料
request.session.delete("session_key")
使用

def session(request):
# request.session
request.session['k1'] = 123 # 設定session
# request.session['k1']
print(request.session.session_key) # 獲得使用者session的随機字元串(存在用戶端浏覽器中,也存在服務端的資料庫中)
return HttpResponse('session')
def index(request): # 獲得session
return HttpResponse(request.session['k1']) # 這裡可以直接讀取到session
簡單列子
②緩存Session

SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的緩存别名(預設記憶體緩存,也可以是memcache),此處别名依賴緩存的設定
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,預設修改之後才儲存
配置 settings.py
使用方法和以上列子是一樣的,隻需要簡單的修改下配置就可以.
③檔案Session

配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 緩存檔案路徑,如果為None,則使用tempfile子產品擷取一個臨時位址tempfile.gettempdir() #如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
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,預設修改之後才儲存
使用方法同上 (↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑)
④緩存+資料庫Session

資料庫用于做持久化,緩存用于提高效率
配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
配置
⑤加密Cookie,Session

配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
⑥登入認證小列子

<form class="common_form" id="Form" method="post" action="/app01/login/">
<div><h1 class="login_title">登入</h1></div>
<div style="width: 600px">
<div class="form_group"><input name="username" class="form-control" label='使用者名' type="text" placeholder="使用者名" require='true'></div>
</div>
<div style="width: 600px">
<div class="form_group"><input name="password" class="form-control" label='密碼' type="password" placeholder="密碼" require='true'></div>
</div>
<div class="form_group"><input class="btn btn-info form_btn" type="submit" value="登入"></div>
</form>
HTML

def login(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
if username == "zhangsan" and password == "123456":
request.session["IS_LOGIN"] = True #建立session
return redirect("/app01/home/")
return render(request,"app01/login.html")
def home(request):
islogin = request.session.get("IS_LOGIN",False)
if islogin:#如果使用者已登入
return render(request,"app01/menus.html")
else:
return redirect("/app01/login/")
def logout(request):#退出
try:
del request.session['IS_LOGIN']
except KeyError:
pass
return redirect("/app01/login/")
views