前言

当我们登录访问一个网站时,服务器需要识别到你已经登录了,才有相应的权限访问登录之后的页面。用户退出登录后,将无权限访问再访问登录后的页面。

从登录到退出的一整个流程,可以看成是与服务器的一次会话,也就是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就没有了

python测试开发django-43.session机制(登录/注销)的更多相关文章

  1. python测试开发django-rest-framework-63.基于函数的视图(@api_view())

    前言 上一篇讲了基于类的视图,在REST framework中,你也可以使用常规的基于函数的视图.它提供了一组简单的装饰器,用来包装你的视图函数, 以确保视图函数会收到Request(而不是Djang ...

  2. python测试开发django-36.一对一(OneToOneField)关系查询

    前言 前面一篇在xadmin后台一个页面显示2个关联表(OneToOneField)的字段,使用inlines内联显示.本篇继续学习一对一(OneToOneField)关系的查询. 上一篇list_d ...

  3. python测试开发django-16.JsonResponse返回中文编码问题

    前言 django查询到的结果,用JsonResponse返回在页面上显示类似于\u4e2d\u6587 ,注意这个不叫乱码,这个是unicode编码,python3默认返回的编码 遇到问题 接着前面 ...

  4. python测试开发django-15.查询结果转json(serializers)

    前言 django查询数据库返回的是可迭代的queryset序列,如果不太习惯这种数据的话,可以用serializers方法转成json数据,更直观 返回json数据,需要用到JsonResponse ...

  5. 2019第一期《python测试开发》课程,10月13号开学

    2019第一期<python测试开发>课程,10月13号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学,方便交流 本期上课时间:10月13号-12月8号,每周六.周日晚上20: ...

  6. Python测试开发-创建模态框及保存数据

    Python测试开发-创建模态框及保存数据 原创: fin  测试开发社区  前天 什么是模态框? 模态框是指的在覆盖在父窗体上的子窗体.可用来做交互,我们经常会看到模态框用来登录.确定等等,到底是怎 ...

  7. Python测试开发-浅谈如何自动化生成测试脚本

    Python测试开发-浅谈如何自动化生成测试脚本 原创: fin  测试开发社区  前天 阅读文本大概需要 6.66 分钟. 一 .接口列表展示,并选择 在右边,点击选择要关联的接口,区分是否要登录, ...

  8. 《Python测试开发技术栈—巴哥职场进化记》—前言

    写在前面 今年从4月份开始写一本讲Python测试开发技术栈的书,主要有两个目的,第一是将自己掌握的一些内容分享给大家,第二是希望自己能系统的梳理和学习Python相关的技术栈.当时我本来打算以故事体 ...

  9. 《Python 测试开发技术栈—巴哥职场进化记》—每日站会的意义

    上文<Python测试开发技术栈-巴哥职场进化记>-一道作业题我们讲到华哥给巴哥出了一道作业题,让巴哥用Python实现记录日志的功能,巴哥历经"千辛万苦",终于做出了 ...

随机推荐

  1. 洛谷P3383线性筛素数

    传送门 代码中体现在那个 $ break $ $ prime $ 数组 中的素数是递增的,当 $ i $ 能整除 $ prime[j ] $ ,那么 $ iprime[j+1] $ 这个合数肯定被 $ ...

  2. ThinkPHP中的统计查询方法

    • count() 表示查询表中总的记录数 • max() 表示查询某个字段的最大值 • min() 表示查询某个字段的最小值 • avg() 表示查询某个字段的平均值 • sum() 表示求出某个字 ...

  3. socket编程之select相关

    FD_ZERO,FD_ISSET这些都是套节字结合操作宏 看看MSDN上的select函数, 这是在select   io   模型中的核心,用来管理套节字IO的,避免出现无辜锁定. int   se ...

  4. final在类和方法中的使用

    package final0; //final修饰的类不能继承//final修饰的方法不能继承public class TestFinal3 { public static void main(Str ...

  5. HTTP 和 HTTPS 的异同

    什么是 HTTPS? HTTPS (基于安全套接字层的超文本传输协议 或者是 HTTP over SSL) 是一个 Netscape 开发的 Web 协议. 你也可以说:HTTPS = HTTP + ...

  6. **CI创建类库(创建自己的工具类等)

    创建类库 当我们使用术语"类库"时,我们一般指的是位于libraries 文件夹中的类,它们在wiki的"类库参考"这个板块被讨论.在当前这个话题中,我们将讨论 ...

  7. for-in循环(for-in Loops)

    for-in循环应该用在非数组对象的遍历上,使用for-in进行循环也被称为“枚举”. 从技术上将,你可以使用for-in循环数组(因为JavaScript中数组也是对象),但这是不推荐的.因为如果数 ...

  8. 【LOJ】#2084. 「NOI2016」网格

    题解 之前用的mapTLE了,今天用了个hash把题卡了过去,AC数++ 我们只要保留一个点为中心周围5 * 5个格子就可以 如果一个点周围5*5个格子有两个不连通,那么显然输出0 如果一个出现了一个 ...

  9. PHP与MySQL设计模式:代理模式

    一.数据库连接通用类 重要的接口: 接口用来存储MySQL连接数据.实现这个接口的类都可以使用这些数据. 通过接口可以隔离出程序中一个简单而必要的部分,任何程序都可以实现这个接口. 接口通过inter ...

  10. POJ - 2115C Looooops 扩展欧几里得(做的少了无法一眼看出)

    题目大意&&分析: for (variable = A; variable != B; variable += C) statement;这个循环式子表示a+c*n(n为整数)==b是 ...