zoukankan      html  css  js  c++  java
  • 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 ---------

  • 相关阅读:
    MVC View基础(转)
    ASP.NET MVC:自定义 Route 生成小写 Url(转)
    python抓取360百科踩过的坑!
    数组循环移位的几种解法
    volatile型变量自增操作的隐患
    HAWQ技术解析(十八) —— 问题排查
    系列网页。前端开发流程
    Python图像处理(8):边缘检測
    析构函数
    Spring(八)编码剖析@Resource注解的实现原理
  • 原文地址:https://www.cnblogs.com/george92/p/11343927.html
Copyright © 2011-2022 走看看