1. Session簡介
客戶端向服務端發送請求獲取登錄頁面,服務端返回給客戶端登錄頁面。客戶端向服務器端發送登錄系統的請求,如果登錄成功,服務端會生成一段隨機字符串,會把隨機字符串和客戶端數據對應起來保存在服務端並返回給客戶端。每一個客戶端登錄成功後,服務端都會保存隨機字符串和數據。當客戶端帶着服務端之前返回的隨機字符串和數據(被寫在瀏覽器的Cookie中)再次向服務端請求數據時,在Session沒有失效的情況下,就不需要驗證客戶端的狀態。Session本質是鍵值對:
{
'zx7a4imi2v5dvfrda1vlw3lkoiao6ubj':{'id':1,'name':'erics'},
}
Session是保存在服務器端的數據,本質上是鍵值對。一般用於Web網站的時候保持與用戶之間的會話,即記錄用戶的的登錄狀態,登錄之後不要求再次登錄。它的優點是敏感信息不會直接給客戶端。Session的應用依賴Cookie,Session需要通過Cookie寫給客戶端瀏覽器。
Cookie是保存在客戶端上的鍵值對!
2. 基於Session的用戶登錄
Django內置Session操作(Flask也內置Session),所以可以直接使用。下面基於Session來完成用戶登錄:
views.py
from django.shortcuts import render, HttpResponse, redirect
from app01 import models
from django.views import View
from utils.md5 import md5
class Login(View):
def get(self, request):
return render(request, 'login.html')
def post(self, request):
name = request.POST.get('name')
pwd = request.POST.get('pwd')
obj = models.User.objects.all().filter(name=name, pwd=md5(pwd)).first()
if obj:
"""
1.生成隨機字符串
2.通過cookie發送給客戶端
3.服務端保存[隨機字符創1:['xx':xx,'xxx':xxx,...]](Session)
"""
request.session['name'] = name
return redirect('/index.html/')
return HttpResponse()
def index(request):
"""
1.獲取客戶端cookie中的字符串
2.去session中查找有沒有這個字符串
3.在session對應key的value中查看有沒有name
"""
v = request.session.get('name')
if v:
return HttpResponse('%s登錄成功!' % (v))
else:
return redirect('/login.html/')
md5.py:
import hashlib
SALT = b'erics'
# 自定義MD5函數
def md5(pwd):
obj = hashlib.md5(SALT)
# pwd是字符串,需要將其轉換成字節
obj.update(pwd.encode('utf-8'))
# 返回密文
return obj.hexdigest()
login.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登錄</title>
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
</head>
<body>
<div class="container" style="margin-top: 10px">
<div class="row">
<div class="col-md-4 col-md-offset-4">
<div class="panel panel-primary">
<div class="panel-heading">
登錄
</div>
<div class="panel-body">
<form action="/login.html/" method="POST" name="loginForm">
<div class="form-group">
<label for="name">用戶名</label> <input type="text" class="form-control" name="name"
placeholder="請輸入用戶名">
</div>
<div class="form-group">
<label for="">密碼</label> <input type="password" class="form-control" name="pwd"
placeholder="請輸入密碼">
<div style="color: red;font-weight: bold">{{ msg }}</div>
</div>
{% csrf_token %}
<button type="submit" class="btn btn-primary">登錄</button>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
登錄頁面:
用戶登錄之後,服務端把Session保存在數據庫中的 django_session
表中,session_data也就是隨機字符串對應的鍵值被內部進行了加密:
登錄成功:
瀏覽器上查看有沒有這樣的cookie: