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)
    """
原文地址:https://www.cnblogs.com/venicid/p/9314852.html