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 ---------

posted @ 2019-08-13 09:32  王先生是胖子  阅读(475)  评论(0编辑  收藏  举报