python测试开发django-43.session机制(登录/注销)

前言

当我们登录访问一个网站时,服务器需要识别到你已经登录了,才有相应的权限访问登录之后的页面。用户退出登录后,将无权限访问再访问登录后的页面。
从登录到退出的一整个流程,可以看成是与服务器的一次会话,也就是session。django里面可以引入session机制实现登录状态的校验。

session设置

Django默认支持Session,其内部提供了5种类型的Session供开发者使用:数据库(默认)、缓存、文件、缓存+数据库、加密cookie。
默认是将Session数据存储在数据库中,在django_session 表中可以查看到。使用最新的 Django 2.X 版本创建新项目的时,在settings.py 中会默认启用session功能。

INSTALLED_APPS = [ 'django.contrib.sessions', # 默认启用sessions应用 ] MIDDLEWARE = [ 'django.contrib.sessions.middleware.SessionMiddleware', # 默认启用 Session 中间层 ]

执行makemigrations和migrate同步数据库后,可以看到用一张django_session表存放session相关的信息

这张表里面用三个字段:session_key(键), session_data(值),expire_date(过期时间)

常用操作

通过HttpRequest对象(也就是视图函数里面的request参数)的session属性进行会话的新增key,查询,和清除session

新增session键值对

request.session[“key”]=”value”

根据key值读取value,如果没读取到,就读默认值

request.session.get('key’, “默认值”)

也可以通过这种方式读取

request.session[“key”]

删除session

request.session.clear()

删除session中的指定键及值,在存储中只删除某个键及对应的值

del request.session['key’]

清除session数据,在存储中删除session的整条数据。

request.session.flush()

会话超时设置,如果不设置,django默认是2个星期过期

request.session.set_expiry(value)

  • 如果value是一个整数,会话将在value秒没有活动后过期。
  • 如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期。
  • 如果value为None,那么会话永不过期。

登录实例

登录页/templates/login.html

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录</title> </head> <body> <div style="margin: 15% 40%;"> <h1>欢迎登录!</h1> <form action="/login_test/" method="post"> {% csrf_token %} <p> <label for="id_username">用户名:</label> <input type="text" id="id_username" name="username" placeholder="用户名" autofocus required /> </p> <p> <label for="id_password">密码:</label> <input type="password" id="id_password" placeholder="密码" name="password" required > </p> <p style="color:red"> {{msg}} </p> <input type="submit" value="确定"> <a href="/forget">忘记密码?</a> </form> <br><br> <a href="/register">新用户先注册</a> </div> </body> </html>

登录成功页/templates/success.html

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>修改密码</title> </head> <body> <div style="margin: 15% 40%;"> <h1>登录成功!</h1><br><br> <h2> <a href="/xadmin/">进主页更多功能</a> </h2> <a href="/logout/"> <i class="show-sm fa fa-sign-out"></i> <span class="hide-sm">注销</span> </a> <form action="/success/" method="post"> {% csrf_token %} <p> <label for="id_psw">原始密码:</label> <input type="text" id="id_psw" name="psw" placeholder="原密码" autofocus required /> </p> <p> <label for="id_new">新密码:</label> <input type="password" id="id_new" placeholder="新密码" name="psw_new" required > </p> <p> <label for="id_re">确认新密码:</label> <input type="password" id="id_re" placeholder="重复新密码" name="psw_re" required > </p> <input type="submit" value="确定"> <p style="color:red"> {{msg}} </p> <a href="/login_test">登录</a> </form> <br><br> </div> </body> </html>

视图函数views.py

from django.shortcuts import render from django.http import HttpResponse, JsonResponse, HttpResponseRedirect from django.contrib.auth import login, logout, authenticate from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required def loginView(request): '''登录''' if request.method == "POST": username = request.POST.get('username', '') psw = request.POST.get('password', '') user = authenticate(username=username, password=psw) if user is not None: if user.is_active: login(request, user=user) request.session['user'] = username return HttpResponseRedirect('/success') else: return render(request, 'login.html', {'msg': '账号或密码错误!'}) else: return render(request, 'login.html', {'msg': ''}) @login_required def successView(request): '''登录成功页''' return render(request, 'success.html', {'msg': ''}) def logoutView(request): '''退出登陆''' logout(request) # 这个方法,会将存储在用户session的数据全部清空 return render(request, 'login.html', {'msg': ''})

urls.py配置访问地址

from django.conf.urls import url from hello import views urlpatterns = [ url(r'^login/', views.loginView), # 登录 url(r'^logout/', views.logoutView), # 退出 url(r'^success/', views.successView),

查看登录session

当第一次访问(使用浏览器的无痕模式)登录页http://localhost:8000/login/,服务端会返回一个cookies值:csrftoken

当输入账号和密码登录成功后,会用个sessionid存到cookies里面

点登陆成功页面的“注销”按钮,sessionid会被清空

重新刷新页面,sessionid就没有了

2019年《python3接口自动化》课程3月17-4月14开课
主讲老师:上海-悠悠
上课方式:QQ群视频在线教学
上课时间:每周六、周日晚上20:30-22:30
报名费:1000

(0)

相关推荐

  • 用 Python 撸一个 Web 服务器-第8章:用户管理

    用户登录原理 用户登录与注册功能几乎已成为 Web 应用的标配.所以我们有必要给 Todo List 程序增加一个用户管理模块,以此来学习用户登录原理. HTTP 协议是无状态的,这意味着每个完整的 ...

  • Django表单系统初体验

    WEB前端开发社区 今天每个 Web 站点上都需要有用户注册.登陆以及退出这些基本功能,有的站会稍微复杂点,比如让用户输入验证码来鉴别是否是机器人,当然这是后话.既然所有的 Web 站点都需要实现这项 ...

  • python测试开发django -140.Bootstrap 缩略图

    前言 网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 class .thumbnail 的& ...

  • python测试开发django -143.Bootstrap 表单控件校验状态

    前言 Bootstrap 对表单控件的校验状态,如 error.warning 和 success 状态,都定义了样式.使用时,添加 .has-warning..has-error 或 .has-su ...

  • python测试开发django -142.Bootstrap 表单(form)

    前言 HTML 表单用于收集不同类型的用户输入.boostrap中表单有几种样式 基本垂直表单 内联表单 form-inline 水平排列表单 form-horizontal 基本表单实例 单独的表单 ...

  • python测试开发django -141.Bootstrap 面板(Panels)

    # 前言 面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 元素添加 class .panel 和 class .panel-default 即可 基础面板 不带标题的基本面 ...

  • python测试开发django -144.Ace Editor 在线编辑python代码

    前言 网页上想在线编辑代码,可以使用Ace Editor 在线编辑实现.比如我们想实现一个功能,在网页版上写python代码,能有python的语法自动补齐功能. Ace Editor 在线编辑 AC ...

  • python测试开发django-10.django连接mysql

    前言 Django 对各种数据库提供了很好的支持,包括:PostgreSQL.MySQL.SQLite.Oracle.本篇以mysql为例简单介绍django连接mysql进行数据操作 Django连 ...

  • python测试开发django-26.表单提交之post登录案例

    前言 注册和登录功能实现都是post请求接口,只不过注册是往数据库插入数据,登录是从数据库里面查询数据. 本篇接着上一篇写个简单的登录页面请求,用户注册时密码加密存储,用户登录时候对输入的密码校验. ...

  • python测试开发django-51.Ajax发送post请求登录案例

    前言 我想实现一个登录功能:登录的接口是另外一个地方提供,页面上点登录按钮的时候,先访问登录接口,根据接口返回json信息判断是否登录成功,登录成功页面跳转,登录不成功,在登录首页显示失败原因 登录页 ...

  • python测试开发django-73.django视图 CBV 和 FBV

    前言 FBV(function base views) 就是在视图里使用函数处理请求,这一般是学django入门的时候开始使用的方式. CBV(class base views) 就是在视图里使用类处 ...