一、session是什么

1.session

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

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

2. 工作原理

  • 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函数

import datetime
import jsonfrom django.core import serializers
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render, redirect# Create your views here.
from userWeb.models import Userdef 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'] = acontext['b'] = bcontext['result'] = resultreturn 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.idreturn 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对象需要先转换成listcontext['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'] = resultreturn 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'] = resultreturn 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 repelif 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 repelse:return HttpResponse("参数不足")# 执行测试Session
def testOperateSession(request):type = request.GET.get('type', None)if type == 'set':request.session["is_login"] = Truerequest.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

3.效果

set操作

get操作

delete操作

fush操作

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

【Django 2021年最新版教程14】session是什么 如何使用相关推荐

  1. cacti php zombie,Cacti1.2.x新版教程之监控本机

    Cacti1.2.x新版教程之监控本机(吴昊博客独家首发)(二) 本文最后修改时间2021.03.17 上一篇文章介绍了Cacti1.2.2新版安装部署流程,本文继续来说下cacti监控. 本篇教程基 ...

  2. 关于部署Django到阿里云服务器教程

    部署Django到阿里云服务器教程 基于Ubuntu16.04 + Python3 + nginx + mysql + Django 欢迎访问我自己的博客网站:www.fengwanqing.xin ...

  3. 77道Spring面试题以及参考答案(2021年最新版)

    77道Spring面试题以及参考答案(2021年最新版),分享给大家~ 一.Spring概述 1. 什么是spring? Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目 ...

  4. Qt最新版5.14在Windows环境静态编译安装和部署的完整过程 VS 2019-Qt static link build Windows 32 bit/64 bit

    文章目录 为什么要静态编译(static link) 1.源码下载/source code download 2. 编译工具下载/compiler download 编译环境选择:MinGW/MSVC ...

  5. 2021年最新版Web前端学习路线图-前端小白入门必读-推荐

    2021年最新版Web前端学习路线图-前端小白入门必读-推荐 Hello,大家好,相信很多学习前端的小伙伴,会有很多的疑惑: 我要学习那些技术? 我要到哪里去学习这些技术呢? 学习这些技术的目的对就业 ...

  6. 最全MySQL8.0实战教程 14 MySQL的存储过程 14.2 入门案例

    最全MySQL8.0实战教程 文章目录 最全MySQL8.0实战教程 14 MySQL的存储过程 14.2 入门案例 14.2.1 格式 14.2.2 操作 - 数据准备 14.2.3 操作 - 创建 ...

  7. 阿里云ECS云服务器租用价格表(2021年最新版)

    对于上云用户来说,阿里云ECS云服务器最新的租用价格表是用户比较关心的问题,应部分站长的要求,小编特别在2021年初整理了一份2021年最新版的价格表,还额外附带了一份学生专属的云服务器价格表,以供参 ...

  8. Java容器--2021面试题系列教程(附答案解析)--大白话解读--JavaPub版本

    Java容器–2021面试题系列教程(附答案解析)–大白话解读–JavaPub版本 前言 序言 再高大上的框架,也需要扎实的基础才能玩转,高频面试问题更是基础中的高频实战要点. 适合阅读人群 Java ...

  9. Directx11教程(14) D3D11管线(2)

    Directx11教程(14) D3D11管线(2) 原文:Directx11教程(14) D3D11管线(2) 下面我们来了解一些GPU memory的知识,主要参考资料:http://fgiese ...

  10. STM32 进阶教程 14 - 程序加密之FLASH读写保护

    前言 在嵌入式应用开发中,应用开发完成后往往需要对芯片中的程序进行加密处理,用以保护程序安全(不至被竞争对手从芯片把程序固件考走),本节将给大学介绍一个如何实现程序自动给芯片加密功能.学完本节内容,你 ...

最新文章

  1. 清空控制台Console.log()信息
  2. C语言网络编程:bind函数详解
  3. 阿里云网盘,开放申请啦!非会员下载 10MB/s!有图有真相!
  4. 单E1光端机,V.35光端机,以太网光端机介绍及技术指标详解
  5. java程序设计实验报告册_20145215《Java程序设计》实验一实验报告
  6. python和nltk自然语言处理书评_Python和NLTK自然语言处理
  7. ReportViewer中设置ServerReport.ReportServerCredentials属性的方法(WEB版)
  8. ssm使用Ajax的formData进行异步图片上传返回图片路径,并限制格式和大小
  9. 洛谷P2879 [USACO07JAN]区间统计Tallest Cow
  10. Lightroom Classic 教程,如何将照片从 Lightroom 移至Ps,在 Ps 中为照片应用滤镜?
  11. 32 GroupSock(AddressPortLookupTable)——live555源码阅读(四)网络
  12. 使用Redis存取数据+数据库存取(spring+java)
  13. python中如何导入图片_python如何导入图片
  14. linux 自动安装脚步,linux自动安装lnmp脚步
  15. 【NLP】统计自然语言处理(第2版)思维导图
  16. 微型计算机8088拆字实验编程,LGN-01B型 PLC可编程控制器及单片机开发系统综合实验台...
  17. 一、ShenYu快速开始
  18. List总结(LinkedList, ArrayList等使用场景和性能分析) [From skywang12345 ]
  19. 谷歌、百度、搜狗、有道搜索个人之比较
  20. 基于struts2的个人信息管理系统(一)

热门文章

  1. java se基础复习3
  2. 文件读写和字符串、列表的排序
  3. Simulink模块之VCO(压控振荡器)
  4. JQuery——基础
  5. 手机交互应用服务(邮件)
  6. OnCreate()和PreCreateWindow()函数的区别
  7. python读取文件路径报invalid_Python 解决OPEN读文件报错 ,路径以及r的问题
  8. 拓端tecdat|Python用时变马尔可夫区制转换(Markov regime switching)自回归模型分析经济时间序列
  9. 拓端tecdat|R语言ggmap空间可视化机动车交通事故地图
  10. 怎么安装winubuntu双系统_U盘安装ubuntu双系统及如何恢复Windows MBR教程