Cookie、Session、CBV加装饰器的三种方法

【0】cookie、session和Token的发展史

【1】Cookie的形式

  • 存储形式:k:v键值对
  • 存储位置:客户端
  • 缺点:不安全,信息可能会泄露

【2】session的形式

  • 标识符,表示我是当前用户加密出来的数据
  • 对敏感信息进行加密处理
    • 存储服务端
    • 标识符配合上你的加密串
  • 把某个数据的标识符+字符串全给服务端
    • 客户端存储格式
      • session_id:返回回来的标识符+加密串

【3】Cookie方法

        【3.1】设置Cookie

obj = HttpResponse('ok')

obj.set_cookie('K','V')



'''
HttpResponse:django的三板斧,返回的是字符串

.set_cookie('k','v')  -------------  设置cookie  k:key值   v:value值


设置cookie是不只是使用django三板斧中的HttpResponse,其余两个都能使用

'''

        【3.2】cookie取值

request.COOKIES.get('k')

        【3.3】设置过期时间

obj.set_cookie('k','v',expires=3)

obj.set_cookie('k','v',max_age=3)


'''
expires:设置超时时间,单位为秒

max_age:设置超时时间,单位为秒

'''

        【3.4】删除cookie

def logout(request,*args,**kwargs):
    
    obj = redirect('/home/')

    obj.delete_cookie('sign')
    return obj

【4】Session

【4.1】session注意事项

  • session基于数据库表才能使用
    • 必须先迁移数据库,生层django_session表
  • session只对当次登录有效
    • 主动清除浏览器中本地存在的session
    • 验签发现,没有sessionid就会生成新的session
  • django_session表中的数据取决于浏览器
  • 同一个计算机(IP地址)上同一个浏览器只会有一条数据生效
  • 同一个计算机(IP地址)上多个浏览器会有多个数据生效
  • 当session过期的时候,可能会出现多条数据对应一个浏览器
    • 但是这些数据不会持久化存储,会被定时清理掉,可以手动清除也可以代码清除
  • 目的是为了节省服务器数据库资源

        【4.2】设置session

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


'''
sign  --------  k值

user  --------  v值

'''

        【4.3】session取值

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

        【4.4】session设置过期时间

# 设置session

request.session['key'] = 'value'

# 设置过期时间

request.session.set_expiry()



'''
参数:
    1、整数:设置多少秒过期
    2、日期:设置到指定日期失效
    3、0:退出浏览器失效
    4、不写:失效时间取决于Django内部全局session失效的时间

'''


        【4.5】清空session

def clear_session(request):
    request.session.delete()





'''
request.session.delete(): 只删除服务端

 
    1、该方法用于删除当前用户的Session数据,但会保留Session的Key
    2、这意味着Session对象本身仍然存在,但其中的数据将被清空
    3、下次访问时,如果Session没有被重新填充,则会得到一个空的Session对象
 
简而言之,就是使用request.session.delete()方法,会删除浏览器端的session,数据库中的数据不会被删除
    
'''
def clear_session(request):
    request.session.flush()



'''
request.session.flush():服务端和客户端都删除
 
该方法用于完全删除当前用户的Session,包括Session对象和所有相关数据

下次访问时,将创建一个新的空Session对象


简而言之,就是删除了浏览器端和数据库中的session 

'''

        【4.6】保存session

        

1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)

2. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置

3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 

4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎

5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎

其他公用设置项:
SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)

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

from django.utils.decorators import method_decorator

# 方式二:放在类视图上面 (放的装饰器函数,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_allowed
        return handler(request, *args, **kwargs)
    
    # 方式一:加在视图函数上面
    # @method_decorator(login_auth)
    def get(self, request, *args, **kwargs):
        return HttpResponse("这是home页面")

         【5.1】补充

CSRF Token相关装饰器在CBV只能加到dispatch方法上

或者加在视图类上然后name参数指定为dispatch方法。

 

备注:

csrf_protect ----------无论settings.py文件中的中间件中的csrf有没有被注释掉都会报错

        1、为当前函数强制设置防跨站请求伪造功能

        2、即便settings中没有设置中间件

 

        

from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.utils.decorators import method_decorator

class HomeView(View):

     @method_decorator(csrf_exempt)
     def dispatch(self, request, *args, **kwargs):
        return super(HomeView, self).dispatch(request, *args, **kwargs)

     def get(self, request):
        return render(request, "home.html")

      def post(self, request):
        print("Home View POST method...")
        return redirect("/index/")

 


csrf_exempt  ---------- settings.py文件中的中间件中的csrf没有注释掉也不会报错

        1、取消当前函数防跨站请求伪造功能

        2、即便settings中设置了全局中间件

 

        

from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.utils.decorators import method_decorator

@method_decorator(csrf_exempt, name='dispatch')
class HomeView(View):
    
    def dispatch(self, request, *args, **kwargs):
        return super(HomeView, self).dispatch(request, *args, **kwargs)
    
    def get(self, request):
        return render(request, "home.html")

    def post(self, request):
        print("Home View POST method...")
        return redirect("/index/")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/179122.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

github访问失败

1. 问题场景 今天了解到notepad可以安装许多插件,但是自动下载插件时总是失败,这些插件的下载源都是github,将地址复制到浏览器也打不开,所以查了下github的访问问题,目前插件已正常下载。 2. 解决方法 gitee上搜索…

[项目管理-33/创业之路-87/管理者与领导者-127]:如何提升自己项目管理的能力和水平

目录 前言: 一、项目经理的角色定位 1.1 项目经理的职责 1.2 不同矩阵类型的项目,项目经理的职责 1.3 项目经理的角色定位 1.4 项目经理的发展路径 二、项目经理项目理论和知识结构 三、软件项目经理在计算机水平的提升 四、项目经理业务知识的…

基于JavaWeb+SSM+Vue家庭记账本微信小程序系统的设计和实现

基于JavaWebSSMVue家庭记账本微信小程序系统的设计和实现 源码获取入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 前言 1.1选题背景 互联网是人类的基本需求,特别是在现代社会,个人…

elasticsearch 7安装

问题提前报 max virtual memory areas error max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 如果您的环境是Linux,注意要做以下操作,否则es可能会启动失败 1 用编辑工具打开文件/etc/sysctl.conf 2 …

Eclipse常用设置-乱码

在用Eclipse进行Java代码开发时,经常会遇到一些问题,记录下来,方便查看。 一、properties文件乱码 常用的配置文件properties里中文的乱码,不利于识别。 处理流程:Window -> Preferences -> General -> Ja…

孟德尔随机化 MR入门基础-简明教程-工具变量-暴露

孟德尔随机化(MR)入门介绍和分章分享(暂时不解读) 大家好,孟德尔随机化大火,但是什么是孟德尔随机化,具体怎么实操呢 这没有其他教程的繁冗,我这篇讲最基础的孟德尔随机化的核心步…

洛谷 P4552 [Poetize6] IncDec Sequence

挺好的一道思维题。 分析 因为是对区间修改,多次修改肯定会超时,很容易想到差分。 那么原题的对区间修改就可以转换为下面三个操作(均在差分数组中): 1. 任选一个数1 2. 任选一个数-1 3. 任选两个数1和-1 进一步考…

【JVM精讲与GC调优教程(概述)】

如何理解虚拟机(JVM)跨语言的平台 java虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,他只关心“字节码”文件。 java不是最强大的语言,但是JVN是最强大的虚拟机。 不存在内存溢出? 内存泄露? JAVA = (C++)–; 垃圾回收机制为我们打理了很多繁琐的…

idea修改行号颜色

前言 i当idea用了深色主题后,发现行号根本看不清,或者很模糊 例如下面这样 修改行号颜色 在IntelliJ IDEA中,你可以根据自己的喜好和需求定制行号的颜色。下面是修改行号颜色的步骤: 打开 IntelliJ IDEA。 转到 “File”&…

机器视觉公司为什么宁愿高薪招新人,也不愿加薪留老员工?老员工特殊时间特殊照顾,新人必须常照顾

​职场常出现的“薪酬倒挂”现象。其实这是正常的职场规律,实际上是企业管理不得不面对的一种选择。 很多企业宁愿老员工离职也不加薪,却高薪请新员工?这就是职场上的鲶鱼效应,一些高层领导认为一个企业,老员工好比沙…

Redis入门指南学习笔记(3):Redis高级特性

一.前言 上一篇博客对Redis常用的数据结构进行了详细介绍。Redis除了丰富的数据类型支持,还包含许多高级特性,例如事务、内存驻留策略、排序、消息队列等,本文将对这些进行逐一介绍。 二.事务 Redis同样包含事务(transaction&a…

MongoDB的常用操作以及python连接MongoDB

一,MongoDB的启动 mongod --dbpath..\data\db mongodb注意同时开两个窗口,不要关! 二, MongoDB的简单使用 简单介绍一下mongoDB中一些操作 show dbs: 显示所有数据库 show databases: 显示所有数据库 use xxxx: 使用指定数据库/创建数据库&#xff08…

java http

超文本传输协议 超文本/html 工作方式 get / url 请求获取相应报文 http://xxxxxxxxxxxx.com/user?xxx xxx 协议类型 - 服务器地址 -路径 path 请求格式: head / body path路径进行处理资源 等同于报文请求: GET: /users HTTP/1.1 Host:api.github.com 响应报文 请求方式…

配电房智能综合监控系统

配电房智能综合监控系统是一种针对配电房环境和设备进行实时监控和管理的系统。依托电易云-智慧电力物联网,它集成了多种先进技术,如物联网、大数据、AI视频智能分析等,实现对配电房全方位、智能化的监控和管理。 这个系统的主要功能可能包括…

Hadoop -hdfs的读写请求

1、HDFS写数据(宏观): 1、首先,客户端发送一个写数据的请求,通过rpc与NN建立连接,NN会做一些简单的校验,文件是否存在,是否有空间存储数据等。 2、NN就会将校验的结果发送给客户端…

汇编-CALL和RET指令

CALL指令调用一个过程, 使处理器从新的内存位置开始执行。过程使用RET(从过程返回) 指令将处理器转回到该过程被调用的程序点上。 CALL指令的动作: 1.将CALL指令的下一条指令地址压栈(作为子过程返回的地址) 2.将被调过程的地址复制到指令指针寄存器E…

Python---global关键字---设置全局变量

global 英 /ˈɡləʊb(ə)l/ adj. 全球的,全世界的;全面的,整体的;(计算机)全局的;球形的 需求:如果有一个数据,在函数A和函数B中都要使用,该怎么办&…

如何使用 Navicat 连接 GaussDB 主备版

Navicat Premium(16.2.8 Windows版或以上) 已支持对GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结构同步、协同合作、数据迁移等),这…

④【Set】Redis常用数据类型: Set [使用手册]

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ Redis Set ④Redis Set 操作命令汇总1. sadd …

千云物流 - 使用k8s负载均衡openelb

openelb的介绍 具体根据官方文档进行安装官方文档,这里作为测试环境的安装使用. OpenELB 是一个开源的云原生负载均衡器实现,可以在基于裸金属服务器、边缘以及虚拟化的 Kubernetes 环境中使用 LoadBalancer 类型的 Service 对外暴露服务。OpenELB 项目最初由 KubeSphere 社区…