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: