session
2.django中session语法
关键部分
1、设置Sessions值
request.session['session_name'] ="admin"
2、获取Sessions值
session_name = request.session["session_name"]
session_name = request.session.get("session_name")
3、删除Sessions值
del request.session["session_name"]
4、flush()
删除当前的会话数据并删除会话的Cookie。
这用于确保前面的会话数据不可以再次被用户的浏览器访问
request.session.flush()
其他方法
5、get(key, default=None)
fav_color = request.session.get('fav_color', 'red')
6、pop(key)
fav_color = request.session.pop('fav_color')
7、keys()
print(request.session.keys())
# dict_keys(['is_login', 'username', 'login_time'])
8、items()
print(request.session.items())
# dict_items([('is_login', True), ('username', 'lingting'), ('login_time', '2018-08-13 00:19:04')])
9、setdefault()
request.session.setdefault("setdefault", "my setdefault")
print(request.session.get("setdefault"))
# my setdefault
10 得到当前用户session的随机字符串
request.session.session_key
# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()
# 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key")
# 删除当前用户的所有Session数据
request.session.delete("session_key")
# session失效策略
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。
session配置
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
配置settings.py 例如:添加如下信息(按项目要求添加)
# 引擎(默认)
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
# Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_NAME = "sessionid"
# Session的cookie保存的路径(默认)就是有效路径
SESSION_COOKIE_PATH = "/"
# Session的cookie保存的域名(默认)有效域名
SESSION_COOKIE_DOMAIN = None
# 是否Https传输cookie(默认)
SESSION_COOKIE_SECURE = False
# 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_HTTPONLY = True
# Session的cookie失效日期,按照秒算(2周)(默认)
SESSION_COOKIE_AGE = 1209600
# 是否关闭浏览器使得Session过期(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
# 是否每次请求都保存Session,默认修改之后才保存(默认)
SESSION_SAVE_EVERY_REQUEST = False
例如:登录之后,访问其他该服务器端口的其他页面
设置了 SESSION_COOKIE_AGE = 10,10秒后失效
又设置了 SESSION_SAVE_EVERY_REQUEST = True
在10秒之内访问该服务器端口的其他页面,失效时间将会向后面延迟。10秒之后访问则正常失效
应用场景:用户登录了以后,连续7天之内访问可以不用登录,一旦间隔7天之后才访问,必须登录!
3.案例学习,用户登录,注销
app01/models.py
from django.db import models
# Create your models here.
class UserInfo(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
pwd = models.CharField(max_length=32)
email = models.EmailField()
tel = models.CharField(max_length=32)
项目/urls.py
from django.urls import path
from app01 import views
urlpatterns = [
path('login/', views.login_session),
path('index/', views.index_session),
path('logout/', views.logout_session),
]
app01/views.py
from django.shortcuts import render,HttpResponse,redirect
from app01.myforms import UserForm
from app01.models import UserInfo
# 登录
def login_session(request):
if request.method == "POST":
user = request.POST.get("name")
pwd = request.POST.get("pwd")
user = UserInfo.objects.filter(name=user, pwd=pwd)
if user: # 查询成功,设置session
request.session["is_login"] = True
request.session['username'] = user[0].name
# 案例,打印上次登录时间
import datetime
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
request.session['login_time'] = now
"""
执行了如下步骤(模拟数据)
1. if request.COOKIE.get("sessionid"): 不生成随机字符串,使用当前的sessionid
else:生成随机字符串 '52f8notfi1id443s1bhsj58p831mqv3x'
2. response.set_cookie("sessionid","52f8notfi1id443s1bhsj58p831mqv3x")
3. 在djiango-session表中创建一条记录:
session_key | session_data | expire_date
... | 序列化的{"is_login":True, "username":"lingting"} | 2018-08-26 11:34:32.542111
"""
return HttpResponse("OK")
else:
return render(request,"login.html",locals())
# 访问index
def index_session(request):
is_login = request.session["is_login"]
username = request.session.get("username")
"""
执行步骤如下模拟:
1. request.COOKIE.get("sessionid") # "52f8notfi1id443s1bhsj58p831mqv3x"
2. 在django-session中过滤记录
session_key | session_data | expire_date
> 52f8notfi1id443s1bhsj58p831mqv3x | 序列化的{"is_login":True, "username":"lingting"} | 2018-08-26 11:34:32.542111
obj = django-session.objects.filter(session-key="52f8notfi1id443s1bhsj58p831mqv3x")
3. is_login = obj.session_data["username"]
username = obj.session_data.get("username")
删除session键值操作
del request.session["key"]
删除当前的会话数据并删除会话的Cookie。
这用于确保前面的会话数据不可以再次被用户的浏览器访问
相当于注销功能
request.session.flush()
"""
print("is_login: ", is_login)
print("username: ", username)
print("session_key:", request.session.session_key)
# 案例,打印上次登录,访问时间
last_login_time = request.session.get('login_time')
import datetime
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
last_visit_time = request.session.get("last_visit_time")
request.session['last_visit_time'] = now
return render(request,"index.html",locals())
# 注销功能
def logout_session(request):
# del request.session["is_login"] 不建议用这种方式
request.session.flush()
"""删除当前的会话数据并删除会话的Cookie。执行步骤如下伪代码
1. 获取sessionid
random_str = request.COOKIE.get("sessionid")
2. 删除记录
django-session.objects.filer(session_key=random_str).delete()
3. 清空对应的cookie
response.delete_cookie("sessionid", random_str)
"""
return redirect("/login/")
templates/login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row" style="padding: 0 18%;margin-top:50px;">
<form action="" method="post">
{% csrf_token %}
<div class="form-group">
<label for="user">用户名</label>
<input type="text" class="form-control" id="user" placeholder="用户名" name="name">
</div>
<div class="form-group">
<label for="Password">密码</label>
<input type="password" class="form-control" id="Password" placeholder="密码" name="pwd">
</div>
<button type="submit" class="btn btn-default">提交</button>
</form>
</div>
</div>
</body>
</html>
templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row">
<a href="/logout/" class="pull-right">注销</a>
</div>
<div class="row text-center">
<h1>hi,{{ username }}</h1>
<h2>上次登录时间:{{ last_login_time }}</h2>
<h2>上次访问时间:{{ last_visit_time }}</h2>
<h2>本次跟新时间:{{ now }}</h2>
</div>
</div>
</body>
</html>
4.Cookie session总结
总结,关键的5条
Cookie
1. 设置Cookie
response.set_cookie(key, value)
2. 读取Cookie
request.COOKIE.get(key)
3. 删除Cookie
response.delete_cookie(key, ...)
session
1. 设置session
request.session[key] = value 注意django对应的操作
2. 读取session
value = request.session[key]
3. 删除/注销session
del request.session["key"]
request.session.flush()