• 05-session-会话跟踪技术


    1、session简介

    Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:

    • 数据库(默认)
    • 缓存
    • 文件
    • 缓存+数据库
    • 加密cookie

    Session是服务器端技术,利用这个技术,服务器在运行时可以 为每一个用户的浏览器创建一个其独享的session对象,

    由于 session为用户浏览器独享,所以用户在访问服务器的web资源时 ,可以把各自的数据放在各自的session中,

    当用户再去访问该服务器中的其它web资源时,其它web资源再从用户各自的session中 取出数据为用户服务。

      

    2、session之保存登录状态信息

    1、写session

    2、session读取

     

     

    3、不同浏览器,会创建不同的session_id

     

    4、views视图代码

    def login_session(request):
        if request.method == "POST":
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
            # user_obj = UserInfo.objects.filter(username=user, password=pwd)  # AttributeError: 'QuerySet' object has no attribute 'username'
            user_obj = UserInfo.objects.filter(username=user, password=pwd).first()
            if user_obj:
                # 设置session
                request.session['is_login'] = True
                request.session['username'] = user_obj.username
    
                """
                设置session步骤
                1.生成随机字符串  q4r5q4rfar32543
                2.response.set_cookie("session_id",q4r5q4rfar32543)
                3.在django-session表创建一条记录:
                    session-key         session-data
                    q4r5q4rfar32543     {"is_login":True, "username":"alex"}
                """
    
                return HttpResponse("登录成功")
    
        return render(request, 'login_session.html')
    
    
    def index_session(request):
        # 获取session
        is_login = request.session.get("is_login")
        print("is_login:", is_login)  # True
        if not is_login:
            return redirect("/login_session/")
    
        username = request.session.get("username")
    
        """
        获取session流程
        1   request.COOKIE.get("session")    #  wspn39juwcrrqxs0916ftmlcvyl7c1gg
        2   django-session表中过滤记录:
            在django-session表中创建一条记录:
                session-key                         session-data
                wspn39juwcrrqxs0916ftmlcvyl7c1gg    {"is_login":True, "username":"alex"}
            obj = django-session.object.filter(session-key=wspn39juwcrrqxs0916ftmlcvyl7c1gg)
    
        3   obj.session-data.get("is_login")
        """
    
        return render(request, "index_session.html", {"username": username})
    View Code

    4、session应用之保存上次登录时间

     

    5、前部分session代码

    modles

    from django.db import models
    
    class UserInfo(models.Model):
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=32)

    主url

    from django.contrib import admin
    from django.urls import path, re_path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        re_path(r'^', include(('app01.urls', 'app01')))
    ]

    url

    from django.urls import path, re_path, include
    from app01 import views
    
    urlpatterns = [
        re_path(r'^login_session/$', views.login_session, name='login_session'),
        re_path(r'^index_session/$', views.index_session, name='index_session'),
    ]

    views

    from django.shortcuts import render, HttpResponse, redirect
    
    from app01.models import UserInfo
    
    
    def login_session(request):
        if request.method == "POST":
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
            user_obj = UserInfo.objects.filter(username=user, password=pwd).first()
            if user_obj:
                # 设置session
                request.session['is_login'] = True
                request.session['username'] = user_obj.username
    
                return HttpResponse("登录成功")
    
        return render(request, 'login_session.html')
    
    
    def index_session(request):
        # 获取session
        is_login = request.session.get("is_login")
        print("is_login:", is_login)  # True
        if not is_login:
            return redirect("/login_session/")
    
        username = request.session.get("username")
        last_visit_time = request.session.get("last_visit_time", "")    # get到last_time
    
        response = render(request, "index_session.html", {"username": username, "last_visit_time": last_visit_time})
    
        import datetime
        now = datetime.datetime.now().strftime("%Y-%m-%d %X")
        request.session["last_visit_time"] = now        # 设置时间
        return response

    模板层

    login_session.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <form action="" method="post">
        {% csrf_token %}
        username <input type="text" name="user">
        password <input type="password" name="pwd">
        <input type="submit" value="登录">
    </form>
    
    </body>
    </html>

    index_session.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h3>hi {{ username }}</h3>
    <p>上次登录时间:{{ last_visit_time }}</p>
    </body>
    </html>

    5、session的更新操作

    同一个浏览器,后面的session_data 会覆盖前面的数据
    

      

    6、基于session的注销功能

    3、删除Sessions值
              del request.session["session_name"]
    4、flush()
         删除当前的会话数据并删除会话的Cookie。
         这用于确保前面的会话数据不可以再次被用户的浏览器访问

    5、get(key, default=None)
      
    fav_color = request.session.get('fav_color', 'red')
      
    6、pop(key)
      
    fav_color = request.session.pop('fav_color')
      
    7、keys()
      
    8、items()
      
    9、setdefault()
    

      

    logout视图

    def logout(request):
        # 删除session值
        del request.session["is_login"]
        del request.session["username"]
    
        # 删除全部数据
        request.session.flush()
    
        """
        删除session流程
        1 random_str = request.COOKIE.get("sessionid")
        2 django-session.objects.filter(session-key=random_str).delete()
        3 response.delete_cookie("sessionid", random_str)
        """
    
        return redirect("/login_session/")

     index_seeion.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h3>hi {{ username }}</h3>
    <p>上次登录时间:{{ last_visit_time }}</p>
    <a href="/logout/">注销</a>
    </body>
    </html>

     

     

    7、session的配置参数

    SESSION_COOKIE_NAME = "sessionid"  # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
    SESSION_COOKIE_PATH = "/"  # Session的cookie保存的路径
    SESSION_COOKIE_DOMAIN = None  # Session的cookie保存的域名
    SESSION_COOKIE_SECURE = False  # 是否Https传输cookie
    SESSION_COOKIE_HTTPONLY = True  # 是否Session的cookie只支持http传输
    SESSION_COOKIE_AGE = 1209600  # Session的cookie失效日期(2周)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期
    SESSION_SAVE_EVERY_REQUEST = False  # 是否每次请求都保存Session,默认修改之后才保存
    

      

    session失效时间15s

    每次访问刷新15s

     

    SESSION_COOKIE_NAME = "yuan"  # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
    SESSION_COOKIE_PATH = "/"     # Session的cookie保存的路径
    SESSION_COOKIE_AGE = 15       # Session的cookie失效日期
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期
    SESSION_SAVE_EVERY_REQUEST = True  # 是否每次请求都保存Session,默认修改之后才保存

      

    8、session练习

    1 登录案例 

    需要的页面: 
    #login.html:登录页面,提供登录表单; 
    #index1.html:主页,显示当前用户名称,如果没有登录,显示您还没登录;
    #index2.html:主页,显示当前用户名称,如果没有登录,显示您还没登录;

    思考,如果第二个人再次再同一个浏览器上登录,django-session表会怎样?

    2 验证码案例

    验证码可以去识别发出请求的是人还是程序!当然,如果聪明的程序可以去分析验证码图片!但分析图片也不是一件容易的事,因为一般验证码图片都会带有干扰线,人都看不清,那么程序一定分析不出来。

    PIL 模块
    

      

    9、cookie与 session总结

    # cookie总结
    1   response.set_cookie(key,value)
    2   request.COOKIE.get(key)
    # sessiono总结
    3   request.session[key] = value    # 写session
        注意django对应操作
    
        '''
        if request.COOKIE.get("session_id")     wspn39juwcrrqxs091
            更新
            在django-session表中创建一条记录:
                session-key                             session-data
                wspn39juwcrrqxs0916ftmlcvyl7c1gg        更新数据
        else:
    
            1.生成随机字符串  q4r5q4rfar32543
            2.response.set_cookie("session_id",q4r5q4rfar32543)
            3.在django-session表创建一条记录:
                   session-key         session-data
                   q4r5q4rfar32543     {"is_login":True, "username":"alex"
        '''
    
       
    4   request.session[key]            # 读session
        '''
         1   request.COOKIE.get("session")    #  wspn39juwcrrqxs0916ftmlcvyl7c1gg
         
         2   django-session表中过滤记录:
             在django-session表中创建一条记录:
                 session-key                         session-data
                 wspn39juwcrrqxs0916ftmlcvyl7c1gg    {"is_login":True, "username":"alex"
             obj = django-session.object.filter(session-key=wspn39juwcrrqxs0916ftmlcvyl7
             
         3   obj.session-data.get("is_login")
    
        '''
    
    
    5. request.session.flush()       # 删除session
        """
        1 random_str = request.COOKIE.get("sessionid")
        
        2 django-session.objects.filter(session-key=random_str).delete()
        
        3 response.delete_cookie("sessionid", random_str)
        """
  • 相关阅读:
    C#设计模式(4)-抽象工厂模式
    【oracle常见错误】ora-00119和ora-00132问题的解决方法
    版本管理工具Git(3)VS2013下如何使用git
    版本管理工具Git(2)git的使用
    C#设计模式(3)-工厂方法模式
    C#设计模式(2)-简单工厂模式
    C# WinForm 技巧:控件截图
    C# WinForm 技巧:COMBOBOX搜索提示
    C# Activator.CreateInstance()方法使用
    visio二次开发——图纸解析之形状
  • 原文地址:https://www.cnblogs.com/venicid/p/9314852.html
Copyright © 2020-2023  润新知