HTTP被設計爲」無狀態」,每次請求都處於相同的空間中。 在一次請求和下一次請求之間沒有任何狀態保持,咱們沒法根據請求的任何方面(IP地址,用戶代理等)來識別來自同一人的連續請求。上圖很明顯的展現了Django的session與cookie的實現原理。服務器會生成兩份相同的cookie字符串,一份保存在本地,一份發向請求的瀏覽器。瀏覽器將收到的cookie字符串保存下來,當下次再發請求時,會將信息與這段cookie一同發送到服務器,服務器獲得這段cookie會與本地保存的那份判斷是否相同,若是相同就表示用戶已經登陸成功,保存用戶登陸成功的狀態。Django的session保存在數據庫中的數據至關於一個大字典,key爲cookie的字符串,value還是一個字典,字典的key和value爲用戶設置的相關信息。這樣就能夠方便的存取session裏面的信息。html
Cookies前端
cookies 是瀏覽器爲 Web 服務器存儲的一小段信息。 每次瀏覽器從某個服務器請求頁面時,它向服務器回送以前收到的cookies。它保存在瀏覽器下的某個文件夾下。sql
瀏覽器下的cookie:數據庫
Session django
Django的Session機制會向請求的瀏覽器發送cookie字符串。同時也會保存到本地一份,用來驗證瀏覽器登陸是否爲同一用戶。它存在於服務器,Django默認會把session存入到數據庫中。瀏覽器
Session依賴於Cookie,若是瀏覽器不能保存cooki那麼session就失效了。由於它須要瀏覽器的cooki值去session裏作對比。session就是用來在服務器端保存用戶的會話狀態。服務器
根據網友lvusyy的友情提示,在操做session以前,你須要同步一下Django的數據庫。我用的是Django自帶的sqlite3.因此須要執行同步的命令:cookie
還有一點,在django處理請求的過程當中,須要通過中間件的過濾,涉及到跨站請求僞造時,django會把請求阻止過濾掉,因此咱們要在setting.py中禁用跨站請求僞造的中間件,若是不由用,記得好像會報一個403的錯誤黃頁。關於跨站請求僞造,以後的章節我會詳細說明其功能用處:session
Django中操做session:app
獲取session:request.session[key] request.session.get(key)
設置session:reqeust.session[key] = value
刪除session:del request[key]
request.session是每個客戶端至關於在上圖中對應的value
一段簡單的Django中實現session的代碼,判斷用戶是否已經成功登陸:
1 def login(request): 2 if request.method =='POST': 3 username = request.POST.get('username') 4 pwd = request.POST.get('pwd') 5 if username =='lisi' and pwd == '12345': 6 request.session['IS_LOGIN'] = True 設置session 7 return redirect('/app01/home/') 8 9 return render(request,'login.html') 10 11 def home(request): 12 is_login = request.session.get('IS_LOGIN',False) 獲取session裏的值 13 if is_login: 14 return HttpResponse('order') 15 else: 16 return redirect('/app01/login/')
cookie能夠有過時時間,這樣瀏覽器就知道何時能夠刪除cookie了。 若是cookie沒有設置過時時間,當用戶關閉瀏覽器的時候,cookie就自動過時了。 你能夠改變 SESSION_EXPIRE_AT_BROWSER_CLOSE 的設置來控制session框架的這一行爲。缺省狀況下, SESSION_EXPIRE_AT_BROWSER_CLOSE 設置爲 False ,這樣,會話cookie能夠在用戶瀏覽器中保持有效達 SESSION_COOKIE_AGE 秒(缺省設置是兩週,即1,209,600 秒)。 若是你不想用戶每次打開瀏覽器都必須從新登錄的話,用這個參數來幫你。若是 SESSION_EXPIRE_AT_BROWSER_CLOSE 設置爲 True ,當瀏覽器關閉時,Django會使cookie失效。
SESSION_COOKIE_AGE:設置cookie在瀏覽器中存活的時間
在settings.py中添加:
結合前端實現的cookie與session會話機制:
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title></title>
6 </head>
7 <body>
8 <form action="/app01/login/" method="post">
9 <input type="text" name="username" />
10 <input type="password" name="pwd" />
11 <input type="submit" value="submit"/>
12 </form>
13
14 </body>
15 </html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style> .header{ height: 48px;
}
</style>
</head>
<body>
<div class="header">
<div style="float: right">{{ username }}</div>
<div style="float: right"><a href="/app01/logout/">註銷</a></div>
</div>
<div style="height: 500px;background-color: #ddd"></div>
</body>
</html>
views.py
def login(request): if request.method == "POST": username = request.POST.get('username') pwd = request.POST.get('pwd') if username == 'alex' and pwd == '123': request.session['IS_LOGIN'] = True request.session['USRNAME'] = 'alex'
return redirect('/app01/home/') elif username == 'eirc' and pwd == '123': request.session['IS_LOGIN'] = True request.session['USRNAME'] = 'eirc'
return redirect('/app01/home/') return render(request, 'login.html') def home(request): is_login = request.session.get('IS_LOGIN', False) if is_login: username = request.session.get('USRNAME', False) return render(request, 'home.html', {'username': username}) else: return redirect("/app01/login/")