一、session是什么

1.session

     Session是保存在服务端的键值对。服务器在运行时可以为每一个用户的浏览器创建一个其独享的 session 对象。

  • 由于 session 为用户浏览器独享,所以用户在访问服务器的 web 资源时,可以把各自的数据放在各自的 session 中。
  • 当用户再去访问该服务器中的其它 web 资源时,其它 web 资源再从用户各自的 session 中取出数据为用户服务。
  •  

2. 工作原理

【Django 2021年最新版教程14】session是什么 如何使用_Django

  • a. 浏览器第一次请求获取登录页面 login。
  • b. 浏览器输入账号密码第二次请求,若输入正确,服务器响应浏览器一个 index 页面和一个键为 sessionid,值为随机字符串的 cookie,即 set_cookie ("sessionid",随机字符串)。
  • c. 服务器内部在 django.session 表中记录一条数据。django.session 表中有三个字段。
  • session_key:存的是随机字符串,即响应给浏览器的 cookie 的 sessionid 键对应的值。
  • session_data:存的是用户的信息,即多个 request.session["key"]=value,且是密文。
  • expire_date:存的是该条记录的过期时间(默认14天)
  • d. 浏览器第三次请求其他资源时,携带 cookie :{sessionid:随机字符串},服务器从 django.session 表中根据该随机字符串取出该用户的数据,供其使用(即保存状态)。

注意: django.session 表中保存的是浏览器的信息,而不是每一个用户的信息。 因此, 同一浏览器多个用户请求只保存一条记录(后面覆盖前面),多个浏览器请求才保存多条记录。

 

3. cookie和session关系

  • cookie  以文本的形式保存在浏览器端,安全性较差,且最大只支持 4096 字节。
  • session 存储在服务器端,保存私密的信息以及可以超过 4096 字节的文本。
  • session 底层依赖 Cookie 技术, Web 服务器可以分配一个唯一的 session 会话 ID 作为每个 Web 客户端的 cookie,对于客户端的后续请求可以使用接收到的 cookie 来识别。
二、Django 中 session 的语法

1.session 设置:

request.session["key"] = value

2.session 获取:

request.session.get('key')

 

3. 得到所有session项

request.session.items()

4.删除 session_data 里的其中一组键值对:

del request.session["key"]

5. 删除所有session

request.session.flush()

 

 

三、实例

1. 新增testCookie和testOperatorCookie函数

【Django 2021年最新版教程14】session是什么 如何使用_Django_02

 

import datetime
import json

from django.core import serializers
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render, redirect

# Create your views here.
from userWeb.models import User


def index(request):
return render(request, './userWeb/index.html')

# 加法页面
def add(request):
return render(request, './userWeb/add.html')

# 执行加法
def doadd(request):
a = request.POST['a']
b = request.POST['b']
a = int(a)
b = int(b)
result = a + b
# return HttpResponse(str(result))
context = {}
context['a'] = a
context['b'] = b
context['result'] = result
return render(request, './userWeb/add_result.html', context)

# 增加用户页面
def testUser(request):
return render(request, './userWeb/testUser.html')

# 执行增加用户
def testAddUser(request):

name = request.POST['name']
level = request.POST['level']
createTime = datetime.datetime.now()

user = User.objects.create(name=name, level=level, createTime=createTime)

context = {}
context['msg'] = '用户新增成功'
context['数据库中的id'] = user.id
return HttpResponse(str(context))

# 数据库查询
def testQueryUser(request):

total = User.objects.count() # 查询所有数据的总量
total_condition = User.objects.filter(level=2).count() # 查询符合条件的数据总量
all_user = User.objects.all() # 查询得到所有用户,使用 all() 方法来查询所有内容。可用索引下标取出模型类的对象。
all_user_condition = User.objects.filter(level=2) # 查询得到指定条件的所有用户
all_user_by_order = User.objects.filter(level=2).order_by('createTime') # 按创建时间从小到大排序,-createTime表示从大到小
a_user_by_id = User.objects.filter(pk=3) #pk=3 的意思是主键 primary key=3,相当于 id=3。因为 id 在 pycharm 里有特殊含义,是看内存地址的内置函数 id(),因此用 pk。
just_show_some_fields = User.objects.filter(pk=3).values("pk", "name") # 只显示id和name者两个字段
print(just_show_some_fields)

context = {}
context['total'] = total # 查询所有数据的总量
context['total_condition'] = total_condition # 查询符合条件的数据总量
context['all_user'] = serializers.serialize("json", all_user) # 查询得到所有用户,使用 all() 方法来查询所有内容。可用索引下标取出模型类的对象。
context['all_user_condition'] = serializers.serialize("json", all_user_condition) # 查询得到指定条件的所有用户
context['all_user_by_order'] = serializers.serialize("json", all_user_by_order) # 按创建时间从小到大排序,-createTime表示从大到小
context['a_user_by_id'] = serializers.serialize("json", a_user_by_id) #pk=3 的意思是主键 primary key=3,相当于 id=3。因为 id 在 pycharm 里有特殊含义,是看内存地址的内置函数 id(),因此用 pk。

#objects.values()返回django.db.models.query.QuerySet对象,需要将ValuesQuerySet对象需要先转换成list
context['just_show_some_fields'] = json.dumps(list(just_show_some_fields)) # 只显示id和name者两个字段

return JsonResponse(context)

# 数据库修改
def testUpdateUser(request):

# 查询出指定的用户
userid=request.GET.get('userid', None)
if userid is None:
return HttpResponse("必须传递userid参数")

# 修改前
before_update = User.objects.filter(pk=userid) #pk=3 的意思是主键 primary key=3,相当于 id=3。因为 id 在 pycharm 里有特殊含义,是看内存地址的内置函数 id(),因此用 pk。
context = {}
context['before_update'] = serializers.serialize("json", before_update)

# 将该用户的level修改为10,返回值:整数,受影响的行数
result = User.objects.filter(pk=userid).update(level=10)

# 修改后
after_update = User.objects.filter(pk=userid) #pk=3 的意思是主键 primary key=3,相当于 id=3。因为 id 在 pycharm 里有特殊含义,是看内存地址的内置函数 id(),因此用 pk。

context['after_update'] = serializers.serialize("json", after_update)
context['the_number_of_rows_affected'] = result

return JsonResponse(context)

# 数据库删除
def testDeleteUser(request):

# 将该用户的level修改为10,返回值:整数,受影响的行数
result = User.objects.filter(pk__in=[2,3]).delete()

context = {}
context['msg'] = "删除成功"
context['the_number_of_rows_affected'] = result

return JsonResponse(context)

# 测试cookie页面
def testCookie(request):
return render(request, './userWeb/testCookie.html')

# 执行测试cookie
def testOperateCookie(request):

type = request.GET.get('type', None)

if type == 'set':
rep = redirect("/testcookie")
rep.set_cookie("is_login", True)
return rep

elif type == 'get':
context = {}
context['is_login'] = request.COOKIES.get('is_login')
return JsonResponse(context)

elif type == 'delete':
rep = redirect("/testcookie")
rep.delete_cookie("is_login")
return rep

else:
return HttpResponse("参数不足")

# 执行测试Session
def testOperateSession(request):

type = request.GET.get('type', None)

if type == 'set':
request.session["is_login"] = True
request.session["username"] = 'Jeff'

# 得到所有session项
context = request.session.items()
return HttpResponse(context)

elif type == 'get':
context = {}
context['is_login'] = request.session.get('is_login')
context['username'] = request.session.get('username')
return JsonResponse(context)

elif type == 'delete':
del request.session["is_login"]

# 得到所有session项
context = request.session.items()
return HttpResponse(context)

elif type == 'flush':
request.session.flush()

# 得到所有session项
context = request.session.items()
return HttpResponse(context)

else:
return HttpResponse("参数不足")

2. 修改urls.py

【Django 2021年最新版教程14】session是什么 如何使用_Django教程_03

 

 

3.效果

【Django 2021年最新版教程14】session是什么 如何使用_Django_04

set操作

【Django 2021年最新版教程14】session是什么 如何使用_Django教程_05

get操作

【Django 2021年最新版教程14】session是什么 如何使用_Django教程_06

delete操作

【Django 2021年最新版教程14】session是什么 如何使用_Django_07

fush操作

【Django 2021年最新版教程14】session是什么 如何使用_Django教程_08

 

 

 

 

 

 

参考:​​https://www.runoob.com/django/django-cookie-session.html​