描述:模拟网页账户密码登录、退出,验证seesion的在浏览器、数据库seesion表的变化过程
整体原理:

1. Django框架目录解构截图

(1)创建及配置templates目录,创建index.html,login.html 2个html文件
【login.html文件】
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1> hello session {{ user }}</h1>
<h2><a href="/loginout/">注销</a></h2>
</body>
</html>
【index.html文件】
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login/" method="post">
用户名:<input type="text" name="user">
密码:<input type="text" name="pwd">
<input type="submit" value="提交">
</form>
</body>
</html>
(2)创建数据库seesion文件
因为此处实现没有model文件创建表结果,只需要一个django_session表即可,用于存储测试seesion信息
>python manage.py makemigrations No changes detected >python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying auth.0010_alter_group_name_max_length... OK Applying auth.0011_update_proxy_permissions... OK Applying sessions.0001_initial... OK
2. 建立url路由路径
from django.contrib import admin
from django.urls import path
from app1 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', views.login), ## 用于测试登录页面
path('index/', views.index), ## 用于测试登录成功后,浏览器会保存session信息,无需再次login登录即可登录index页面,用于模拟网页登录账户密码成功之后,才能访问其他内部页面。
path('loginout/', views.loginout), ## 模拟退出登录,seesion清除,返回登录页;模拟需要登录才能访问内部其他页面
]
3. 配置views视图
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
def login(request):
if request.method == "GET":
# return HttpResponse('ok')
return render(request,"login.html")
elif request.method == "POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd")
if user == "wangwen" and pwd == "111":
"""
(1) 生成一个session_id 作为键 (一个随机字符串) e98xho04o8drexvdgij17tzjyhzab1jg 系统自己写
(2) 存放在客户端浏览器一份, response.set_cookie("session_id","键名") 系统自己写
相当于给浏览器一把下一次取件的钥匙,通过session_id来取件
(3) 存放在服务端数据库一份,在django_session 表中添加记录 系统自己写
session_key session_data expire_date
键名 数据 过期时间
"""
# 存储session的写法
request.session["is_login"] = True
request.session["user"] = "wangwen"
return HttpResponse("验证成功")
else:
return HttpResponse("验证失败")
def index(request):
# 获取session的相关数据
is_login = request.session.get("is_login")
user = request.session.get("user")
"""
(1) 浏览器拿着cookie中存放的session_id去服务端取数据, session_id = request.COOKIES.get("session_id")
(2) 在django_session表中,查看下该键名对应的过期时间是否到期
(3) ok的话,获取到该键对应的session_data,进而取出里面的数据
"""
print(is_login)
print(user)
if is_login:
return render(request,"index.html",{"user":user})
else:
return redirect('/login/')
def loginout(request):
# 清除服务端的session 删除的是当前的sessionid在数据库储存的那一条自己的记录
request.session.flush()
return redirect('/login/')
4. 测试网页
(1)登录网页,输入账户密码:kyle/111

访问登录成功页面:

(2)查看数据库seesion与网页seesion id信息一致
查看数据库session:

查看网页session信息:

验证说明浏览器会保留缓存seesionid内容信息,用于下次登录与数据库session信息进行比对
(3)经过1,2步骤,完成模拟了类似登录账户密码操作;现在模拟登录成功之后,才能访问其他页面,进行访问index页面
刚刚开发登录index页面是无法进入下面页面的,只会跳转到login页面

(4) 点击注销:模拟退出登录网站,会跳转到登录页面,就会删除浏览器缓存的session信息,数据库也会删除session信息

查询数据库session,发现已经被删除

(5)用户下次登录时候,直接访问网站内容,比如index页面,只能访问跳转登录首页

通过以上,可以模拟出来session在登录退出过程中,seesion信息如何在浏览器、数据库中缓存及删除的过程。