django框架(六)-----状态保持(session)

一、思考

在第五节中我们讲到用cookie来记录状态,但是用浏览器存储cookie的方式不太安全,那有没有更好的存储登入状态的方式呢???
当然有啦!!!那就是我们接下来要讲到的session

二、状态保持——cookie和session

在这里插入图片描述

三、状态保持

  • http协议是无状态的,每次请求都是一次新的请求,不会记得之前通信的状态
  • 客户端与服务端的一次通信,就是一次会话实现保持的方法:在客户端或服务端存储与会话有关的数据
  • 存储方式包括cookie, session,会话一般指session对象
  • 使用cookie,所有数据储存在客户端,注意不要储存敏感信息
  • 使用session, 所有数据储存在服务端,在客户端cookie中存储sessionid
  • 状态保持的目的是在一段时间内跟踪请求者的状态,实现跨页面访问当前请求者的数据
  • 注意:不同的请求者之间不会共享这个数据,与请求者一一对应

四、使用session

  • 在项目目录下的settings.py中
INSTALL_APPS = {
	'django.contrib.sessions',
}

MIDDLLEWARE = [
	'django.contrib.sessions.middleware.SessionMiddleware',
]

注意:使用session之前需要先执行makemigrations,migrate的模型映射文件命令,在数据库中有生成django_session的表格

  • 使用session
    启用会话后,每个HttpRequest对象将具有一个session属性,它是一个类字典对象
方法作用
get(key, default=None)根据键获取会话的值
clear()清空所有会话
flush()删除当前的会话数据并删除所有的cookie
del request.session[‘key’]删除某个会话值

案例:
① 在app teacher/views.py中

from django.shortcuts import render, redirect, reverse


def index(request):
    username = request.session.get('username', '')
    return render(request, 'teacher/index.html', context={'username': username})


def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        request.session['username'] = username
        return redirect(reverse('teacher:index'))
    return render(request, 'teacher/login.html')


def logout(request):
    request.session.flush()
    return redirect('teacher:index')

② 在teacher/urls.y中

from django.urls import path
from . import views


app_name = 'teacher'
urlpatterns = [
    path('index/', views.index, name='index'),
    path('login/', views.login, name='login'),
    path('logout/', views.logout, name='logout')
]

③ 在templates/teacher/index.html中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index page</title>
</head>
<body>
    {% if username %}
        欢迎 <span style="color: orange">{{ username }}</span>登录!!!
        <a href="{% url 'teacher:logout' %}">退出登录</a>
    {% else %}
        您还未登录!!!
        <a href="{% url 'teacher:login' %}">登录</a>
    {% endif %}
</body>
</html>

④ 在templates/teacher/login.html中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login page</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <p>用户名:<input type="text" name="username"></p>
    <input type="submit" value="登录">
</form>
</body>
</html>

⑤ 在浏览器中访问:
在这里插入图片描述
点击登录并输入用户名
在这里插入图片描述
可以看到session获取到的用户名已显示,此时再点击退出登录
在这里插入图片描述
如下图所示,又回到了原来刚开始访问的状态!
在这里插入图片描述
设置会话过期时间:通过request.session.set_expiry(value)来设置
① 如果value是一个整数,会话将在value秒没有活动后过期
② 如果value是一个imedelta对象,会话将在当前时间加上这个指定的日期/时间过期
③ 如果value为0,那么用过会话的cookie将在用户的浏览器关闭时过期
④ 如果value为None,那么会话永不过期!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值