Django之Session
session:是保存在服务器端的数据(本质是键值对)。
什么是session:
session是保存在服务器端的数据,可以是键值对,也可以是任何数据类型的数据。
session是直译就是会话,保持会话。
http请求是无状态短连接。来一次请求,回一次请求,并断开连接。cookie就解决了第二次请求来时,身份识别的工作。
而session就是做这个检测的。
session在应用中是依赖cookie的。他的作用是保持web的会话。保持与用户的会话。
session的流程:
一个登陆请求的url,输入用户名密码,然后post提交。然后有一个键值对发从到cookie里,用set_cookie设置cookie的值。这个cookie里面存储的是再下次请求来时,能识别出当前用户的身份识别信息。也可以理解为是当前用户的唯一标识。但是cookie的这样的传递身份识别是有问题的, 比如在前端页面,身份id是1,但是在前端更改成id为2的话,那么第二次访问请求来时,这时的身份id就是2了,这对于请求的安全是没有保障的。就算cookie带有签名,也依旧可以在前端获取,退一万步讲,签名加密,也依旧有可以破解的可能。
所以,解决的方式是,在登录成功时,加一个随机的字符串。发从到cookie里面。这个随机字符串是原生的字符串,他可以是md5加密的字符串,也可以是其他任何类型的数据字符串。
然后在session在服务器端在存储一遍这个字符串,以键值对的形式存储。在这个字符串里加上字典。
等第二次在有访问请求时,会先对比请求的cookie中的字符串和服务器端存储的字符串是否一致,如果一致,再将与其对应的id为1的数据发
送给响应。这样的效果就是session在服务器将数据保护起来,而前端拿到的只有字符串而已,并拿不到后面的数据。并且根据字符串是无法计算出对应的数据值是什么的。
{
"asdfasdfadsfasdfasd":{"id":1,"name":"george",email="xxxxx"}
}
session的好处:
敏感数据不会直接给客户端。
流程:
1、GET请求来服务器,获取页面返回。
2、返回是页面加数据已POST请求再去服务器,这时的服务器验证登录。
3、如果登录成功,则在服务器端生成一个随机字符串。并连同登录成功结果和字符串返回给客户端。
4、服务器在内存中保存一份字符串和与字符串相关的数据。
用session实现用户登录:
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>登录</h1>
<form method="post" action="/login/">
{% csrf_token %}
<p>username: <input type="text" name="username"> </p>
<p>password: <input type="text" name="password"></p>
<input type="submit" value="subimt">{{ msg }}
</form>
</body>
</html>
views.py
def login(request):
if request.method == "GET":
return render(request,"login.html")
else:
username = request.POST.get("username")
password = request.POST.get("password")
if username == "wangzhe" and password == "123":
#1.生成随机字符串
#2.通过cookie发送给客户端
#3.服务器保存session {"随机字符串":{字典里是当前用户的信息}}
#3.服务器保存session {"adfaf":{"username":"wangzhe","password":123,....}}
request.session["username"] = "wangzhe"
#这样就给username加了session。
request.session["password"] = "123"
return redirect('/index/')
else:
return render(request,"login.html",{"msg":"username or passwrod is error"})
def index(request):
#1.获取客户端cookie中的随机字符串
#2.去session中查找有没有随机字符串
#3.判断session的字典的值,比如username有没有值,如果有值,说明已经登录了
v = request.session.get("username")
if v:
return HttpResponse("登陆成功:%s" %v)
else:
return redirect('/login/')
view函数的连接数据库的用户名匹配:
def login(request):
if request.method == "GET":
return render(request,"login.html")
else:
username = request.POST.get("username")
password = request.POST.get("password")
obj = models.UserInfo.objects.filter(username=username,password=password).first()
if obj:
#1.生成随机字符串
#2.通过cookie发送给客户端
#3.服务器保存session {"随机字符串":{字典里是当前用户的信息}}
#3.服务器保存session {"adfaf":{"username":"wangzhe","password":123,....}}
request.session["username"] = obj.username
#这样就给username加了session。
request.session["password"] = obj.password
return redirect('/index/')
else:
return render(request,"login.html",{"msg":"username or passwrod is error"})
def index(request):
#1.获取客户端cookie中的随机字符串
#2.去session中查找有没有随机字符串
#3.判断session的字典的值,比如username有没有值,如果有值,说明已经登录了
v = request.session.get("username")
if v:
return HttpResponse("登陆成功:%s" %v)
else:
return redirect('/login/')
前端结果代码查看:
session的值存放在数据库的表里了,在django_session中。session_key是发给前端的字符串,session_data是前端传来的数据的加密,是username和password的加密值
--------- END ---------