zoukankan      html  css  js  c++  java
  • Django session使用

    描述:模拟网页账户密码登录、退出,验证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信息如何在浏览器、数据库中缓存及删除的过程。

  • 相关阅读:
    调用GOOGLE的TTS实现文字转语音(XE7+小米2)(XE10.1+小米5)
    Android实例-设置消息提醒(XE8+小米2)
    FastReport二维码打印存在的问题
    一个DELPHI操作USB摄像头类
    利用Delphi编程控制摄像头(图)
    Delphi实现拍照控件的程序代码
    win dos命令行设置ip和dns
    daemontools管理fast-fail的zookeeper
    zookeeper定时清理log
    生成所有全排列 非递归和递归实现
  • 原文地址:https://www.cnblogs.com/NGU-PX/p/14241393.html
Copyright © 2011-2022 走看看