Django之Session
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的加密值
参考session:www.cnblogs.com/wupeiqi/articles/5246483.html
--------- END ---------