Django框架之Cookie和Session和CBV加装饰器的三种方法

2023-11-23 14:52

本文主要是介绍Django框架之Cookie和Session和CBV加装饰器的三种方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【一】Cookie与Session

Cookie和Session是用来在Web应用程序中跟踪用户会话数据的两种常用技术。

【1】Cookie和Session的发展史

【1】Cookie的发展史:

  1. 1994年,网景通信公司推出了第一个浏览器Cookie技术。Cookie是存储在用户计算机上的小型文本文件,用于跟踪用户在网站上的活动。
  2. 初始版本的Cookie只能存储很少的数据,并且没有强制加密机制,容易被恶意用户篡改或窃取。因此,随着互联网的快速发展,Cookie引起了一系列安全和隐私问题。

【2】Session的发展史:

  1. 由于Cookie存在的局限性,Web开发人员开始寻找更安全、可靠的替代方案。1997年,Sun Microsystems提出了基于服务器的会话管理方案,即Session。
  2. Session是在服务器端存储用户会话数据的一种技术。每当用户访问网站时,服务器会为其创建一个唯一的Session标识符(Session ID),并将会话数据存储在服务器上。
  3. Session ID一般通过Cookie或URL参数传递给客户端,用于识别用户的会话状态。

【2】Cookie和Session的关系:

  1. 在实际应用中,Cookie和Session通常结合使用。当用户首次访问网站时,服务器会为其分配一个唯一的Session ID,并将其存储在Cookie中,发送给客户端保存。
  2. 随后,客户端在每次请求中都会携带该Cookie,服务器通过解析Cookie中的Session ID,读取对应的会话数据,实现用户状态的跟踪和管理。

【1】总结:

  • Cookie和Session是Web应用程序中常用的用户会话跟踪技术。
  • Cookie通过在客户端存储小型文本文件,并将会话标识符传递给服务器,实现会话状态的保持。
  • 而Session则是在服务器端存储会话数据,通过Session ID实现对用户会话的追踪。
  • 它们的发展历程与互联网的发展紧密相关,为开发人员提供了更多的选择,以保障安全性和用户体验的提升。

【3】Cookie与Session详解

【1】Cookie

  • 服务器保存在客户端浏览器上的信息都可以称之为cookie
  • 它的表现形式一般都是k:v键值对(可以有多个)

【2】Session

  • 保存在服务器上的信息都可以称之为session
  • 它的表现形式一般都是k:v键值对(可以有多个)

【3】token

  • session虽然数据是保存在服务端的,但是挡不住数据量大
  • 解决办法:服务端不再保存数据
    • 登陆成功之后,将一段信息加密处理(用自己独特的加密方式进行加密)
  • 将加密之后的结果拼接在信息后面,整体返回给浏览器保存
  • 浏览器下次访问的时候带着该信息,服务端自动切取前面的一段信息再次使用自己的加密算法进行加密
  • 然后用这段密文与携带过来的密文进行比对

【4】总结

  • cookie就是保存在客户端浏览器上的信息
  • session就是保存在服务端上的信息
  • session是基于cookie工作的(其实大部分的保存用户状态的操作都需要使用cookie)

【2】Django操作Cookie

  • 虽然cookie是服务端告诉客户端浏览器需要保存内容
  • 但是客户端浏览器可以选择拒绝保存
  • 如果禁止自动保存cookie
    • 那么只要是需要登录的网站都没办法正常登录了

【1】三板斧-视图函数返回

- return HttpResponse() 
- return render() 
- return redirect()
obj = HttpResponse("ok")
obj.set_cookie('k','v')

【2】设置cookie

def login(request, *args, **kwargs):if request.method == 'POST':username = request.POST.get("username")password = request.POST.get("password")if username == "dream" and password == "521":obj = HttpResponse("ok")obj.set_cookie('sign', 'user')return objelse:return redirect('/login/')return render(request, 'login.html')
  • 取值cookie验证
def home(request, *args, **kwargs):sign = request.COOKIES.get('sign')if sign and sign == 'user':return HttpResponse("这是home页面")else:return redirect('/login/')

【3】取值

request.COOKIES.get('k')

【4】设置超时时间

obj.set_cookie('sign', 'user', expires=3)
obj.set_cookie('sign', 'user', max_age=3)
#设置超时时间3s到期
  • max_age

    • 设置超时时间,以秒为单位

  • expiress

    • 设置超时时间 针对IE浏览器使用,以秒为单位

【5】注销cookie

def logout(request, *args, **kwargs):obj = redirect('/home/')# 设置超时时间 3s 到期obj.delete_cookie('sign')return obj

【6】完整版 cookie登录注册

def login(request, *args, **kwargs):# next_url = request.get_full_path()# print(next_url) # /login/?next_url=/home/if request.method == 'POST':username = request.POST.get("username")password = request.POST.get("password")if username == "dream" and password == "521":next_url = request.GET.get('next_url')# print(next_url) # /home/obj = redirect(next_url)obj.set_cookie('sign', 'user')return objelse:return redirect('/login/')return render(request, 'login.html')def login_auth(func):def inner(request, *args, **kwargs):# print(request.path_info) #  /home/# print(request.get_full_path()) # /home/?username=111next_url = request.get_full_path()  # /home/# print(next_url)# /home/sign = request.COOKIES.get('sign')if sign and sign == 'user':res = func(request, *args, **kwargs)return reselse:return redirect(f'/login/?next_url={next_url}')return inner@login_auth
def home(request, *args, **kwargs):return HttpResponse("这是home页面")# def home(request, *args, **kwargs):
#     sign = request.COOKIES.get('sign')
#     if sign and sign == 'user':
#         return HttpResponse("这是home页面")
#     else:
#         return redirect('/login/')@login_auth
def index(request, *args, **kwargs):return HttpResponse("这是index页面")

【3】Django操作Session

  • session数据是保存在服务端的,给客户端返回的是一个随机字符串
    • sessionid:随机字符串

【1】设置Session

request.session['sign'] = 'user'

【2】取值session

sign = request.session.get('sign')

【3】session设置过期时间

            request.session['sign'] = 'user'# 如果是数字的话就是指定 s shu# request.session.set_expiry(3)# 0 就是关闭浏览器后自动清除浏览器的sessionidrequest.session.set_expiry(0)
  • 参数
    • 整数
      • 多少秒过期
    • 日期对象
      • 到指定日期失效
    • 0
      • 一旦退出当前浏览器窗口就失效
    • 不写
      • 失效时间取决于Django内部全局session失效的时间

【4】删除session

    # 删除session方式一# request.session.delete()# 把浏览器和数据库里面的session全部清除掉request.session.flush()
(1)request.session.delete():

只删除服务端的

  • 该方法用于删除当前用户的Session数据,但会保留Session的Key。
  • 这意味着Session对象本身仍然存在,但其中的数据将被清空。
  • 下次访问时,如果Session没有被重新填充,则会得到一个空的Session对象。
(2)request.session.flush():

服务端和客户端都删除

  • 该方法用于完全删除当前用户的Session,包括Session对象和所有相关数据。
  • 下次访问时,将创建一个新的空Session对象。

【5】注意

  • session基于数据库表才能使用的

    • 必须先迁移数据库,生成 django_session 表

  • session只对当次登录有效

    • 主动清除浏览器中本地存在的session

    • 验签发现,没有sessionid就会自动生成新的session

  • django_sessoin表中的数据条数取决于浏览器

  • 同一个计算机(IP地址)上同一个浏览器只会有一条数据生效

  • 同一个计算机(IP地址)上多个浏览器会有多个数据生效

  • 当session过期的时候,可能会出现多条数据对应一个浏览器

    • 但是这些数据不会持久化存储,会被定时清理掉,可以手动清除也可以代码清除

  • 目的是为了节省服务器数据库资源

def login(request, *args, **kwargs):# next_url = request.get_full_path()# print(next_url) # /login/?next_url=/home/if request.method == 'POST':username = request.POST.get("username")password = request.POST.get("password")if username == "dream" and password == "521":# next_url = request.GET.get('next_url')# print(next_url) # /home/request.session['sign'] = 'user'obj = redirect('/home/')# 设置过期时间# obj.set_cookie('sign', 'user', expires=3)# obj.set_cookie('sign', 'user', max_age=3)return objelse:return redirect('/login/')return render(request, 'login.html')def login_auth(func):def inner(request, *args, **kwargs):# print(request.path_info) #  /home/# print(request.get_full_path()) # /home/?username=111next_url = request.get_full_path()  # /home/# print(next_url)# /home/sign = request.session.get('sign')# print(sign) # userif sign and sign == 'user':res = func(request, *args, **kwargs)return reselse:return redirect(f'/login/?next_url={next_url}')return inner@login_auth
def home(request, *args, **kwargs):return HttpResponse("这是home页面")

【二】 CBV加装饰器的三种方法

from django.utils.decorators import method_decorator
  • 方式一:加载视图函数上面
    @method_decorator(login_auth)def get(self, request, *args, **kwargs):return HttpResponse("这是home页面")def post(self):
  • 方式二:放在类视图上面 (放的装饰器函数,name指定你的视图函数里面的方法)
# @method_decorator(login_auth, name='get')
# @method_decorator(login_auth, name='post')
class UserView(View):
  • 方式三 : dispactch 方法加装饰器 : 本视图函数内所有的视图都需要走装饰器
    @method_decorator(login_auth)def dispatch(self, request, *args, **kwargs):# Try to dispatch to the right method; if a method doesn't exist,# defer to the error handler. Also defer to the error handler if the# request method isn't on the approved list.if request.method.lower() in self.http_method_names:handler = getattr(self, request.method.lower(), self.http_method_not_allowed)else:handler = self.http_method_not_allowedreturn handler(request, *args, **kwargs)

这篇关于Django框架之Cookie和Session和CBV加装饰器的三种方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/418714

相关文章

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地