1-session保存状态
状态保持----cookie和session
什么是状态保持:
1.http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态
2.客户端与服务器端的一次通信,就是一次会话实现状态保持的方式:在客户端或服务器端存储与会话有关的数据
3.存储方式包括cookie、session,会话一般指session对象
4. 使用cookie,所有数据存储在客户端,注意不要存储敏感信息
5.使用sesison方式,所有数据存储在服务器端,在客户端cookie中存储session_id
6状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据
- 注意:不同的请求者之间不会共享这个数据,与请求者一一对应
2-启用session
在settings.py文件中 默认是都有的启用的
然后再pycharm 中 找到tools工具
点击tools中的 run manage.py Task
执行这两条命令后 再去navicat数据库中查看django_session
注: 使用session之前需要先执行makemigrations,migrate的模型映射文件命令,在数据库中有生成django_session的表格.
3-使用session
启用会话后,每个HttpRequest对象将具有一个session属性,它是一个类字典对象
- get(key, default=None):根据键获取会话的值
- flush():删除当前的会话数据并删除会话的Cookie
1.一个既可读又可写的类似于字典的对象,表示当前的会话.
2.在登录中使用request.session设置一个登录的信息.
3.在主页面中获取设置的值,然后传给模板.
4.使用request.session.flush()清除会话数据.
4-用户登录状态例子
1-在views.py中
from django.shortcuts import render,redirect,reverse
from django.http import HttpResponse
from django.views import View
# Create your views here.
def index(request):
"""
查找用户是否存在 存在就显示登录状态 否则就登录
:param request:
:return:
"""
username =request.session.get("username","用户未登录")
return render(request,'FM/index.html',context={
'username':username,
})
class LoginResponse(View):
def get(self,request):
return render(request,'FM/login.html')
def post(self,request):
"""
1-获取参数
2-校验参数
3-业务逻辑 session的判断
4-返回响应
:param request:
:return:
"""
#1-获取用户名
#2-设置session
#3-设置session过期时间 默认15天 如果没有勾选记住我 当关闭游览器 会清除session
username = request.POST.get("username")
request.session["username"] = username
request.session.set_expiry(0) #关闭游览器清除
return redirect(reverse("FM:index"))
def exit(request):
request.session.flush()
return redirect(reverse("FM:index"))
2-url路由配置
from django.urls import path
from . import views
app_name="FM"
urlpatterns = [
path('index/',views.index,name="index"),
path('login/',views.LoginResponse.as_view(),name="login"),
path('exit/',views.exit,name="exit"),
]
3-模板内容
在templates目录下创建FM目录 在FM目录下创建Index.html以及login.html
index.html里面的内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
欢迎: {{ username }}<br>
<a href="{% url 'FM:login' %}">登录</a><br>
<a href="{% url 'FM:exit' %}">退出</a>
</body>
</html>
login.html里面的内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
<input type="text" name="username" placeholder="请输入用户名"><br>
<input type="password" name="password" placeholder="请输入密码"><br>
<input type="email" name="email" placeholder="">
<input type="submit" value="登录">
</form>
</body>
</html>
5-会话过期时间
- set_expiry(value):设置会话的超时时间
- 如果没有指定,则两个星期后过期
- 如果value是一个整数,会话将在values秒没有活动后过期
- 若果value是一个imedelta对象,会话将在当前时间加上这个指定的日期/时间过期
- 如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期
- 如果value为None,那么会话永不过期
可以不配置,那么都是默认的选项
6-效果演示
清除session 点击退出 用户就显示未登录状态