Django——会话.CookieSession

news2024/11/28 18:36:38

Django——会话.Cookie&Session

一、Cookie

会话指的是浏览器与web服务器之间的通信。HTTP协议是无状态协议。web服务器无法知道用户上一次会话数据,用来维护用户在访问网站过程中的状态 , 会话控制使用 Cookie 和 Session 一起实现。

通常把 Session 称为会话对象 , web服务器会给每一个用户创建一个 Session 对象 ,Session 对象在服务器端保存用户数据。Cookie 用于浏览器端保存用户数据。

Cookie 原理:当客户端访问服务端的时候,服务器会生成一份 Cookie 数据传输给浏览器,浏览器会自动把这份 Cookie 数据保存起来。之后浏览器在每一次请求访问的时候都回自动的携带这个 Cookie 数据。

Cookie保存是文本数据,以键值对的方式保存信息

def cookie_set(request):
    # 设置 Cookie 数据,因为 Cookie 要响应给浏览器
    # 所以设置 Cookie 数据要使用 HttpResponse 对象或者其子类对象
    # Cookie 数据在浏览器中保存的时间默认为 2 周
    response = HttpResponse('设置 Cookie 数据')
    # set_cookie(key , value) , 设置 Cookie 的数据不能是中文
    # max_age 设置过期时间, 单位:秒
    # expires 以时间对象为单位设置过期时间 , datetime.timedelta()
    response.set_cookie('name','ac' , max_age=30)
    # datetime.datetime.now()+datetime.timedelta(days=2) 设置两天后过期
    response.set_cookie('age','27' , expires=datetime.datetime.now()+datetime.timedelta(days=2))
    return response

def cookie_get(request):
    print(request.COOKIES)
    print(request.COOKIES.get('name'))
    return HttpResponse('获取 Cookie 数据')

def cookie_del(request):
    # 删除 Cookie 数据需要通过使用 HttpResponse 对象或者其子类对象
    response = HttpResponse('设置 Cookie 数据')
    # delete_cookie 删除 Cookie 数据
    response.delete_cookie('age')
    return response

验证登录

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

def login(request):
    if request.method == 'GET':
        return render(request , 'login.html')
    name =request.POST.get('username')
    password =request.POST.get('password')

    if not all([name , password]):
        return render(request , 'login.html',{'error':'用户名或者密码错误'})

    # 获取请求中的重定向 url 的参数
    url = request.GET.get('redirect_url')
    # 判断是否有携带这个重定向的 url 参数
    # 有,登录成功之后重定向到参数指定的 url 中
    # 没有 , 默认响应首页
    if url:
        response = redirect(url)
    else:
        response = redirect('/index/')

    response.set_cookie('cookie_data' , name)
    return response

def cart(request):
    # 获取浏览器请求中的 Cookie 数据
    res = request.COOKIES.get('cookie_data')
    # 判断是否有携带制定的键值对数据
    if res:
        return HttpResponse('购物车页面')
    else:
        # 浏览器没有这份数据,需要进行登录
        url = request.path
        return redirect(f'/login/?redirect_url={url}')
def wap(func):
    def inner(request , *args , **kwargs):
        # 获取浏览器请求中的 Cookie 数据
        res = request.COOKIES.get('cookie_data')
        # 判断是否有携带制定的键值对数据
        if res:
            # 返回对应的视图函数
            return func(request)
        else:
            # 浏览器没有这份数据,需要进行登录
            url = request.path
            return redirect(f'/login/?redirect_url={url}')
    return inner

@wap
def cart(request):
    return HttpResponse('购物车页面')

@wap
def info(request):
    return HttpResponse('个人信息页面')

Cookie 保存数据大小是有限制的,最大保存 4KB;

一个服务器最多在浏览器上保存 20 个 Cookie 数据;

一个浏览器最多保存 300 个 Cookie。

二、Session

Session 跟 Cookie不同的是 Session 数据是保存在服务器中。

当浏览器第一次请求去服务器的时候,服务器会生成一份 Session 的 id 编号给浏览器,是以 Cookie 的形式发给浏览器, 后续浏览器的请求,都会携带这个份 id 进行访问。

Session也是键值对的方式保存用户数据,Session 在服务器给每一个用户创建一个 Session 对象,对象的 id 值是保存在数据库中。

在操作 Session 的数据必须先迁移数据库。

def session_set(request):
    # 设置 Session 数据,通过 request 进行设置
    # 保存 Session 数据之后,会自动生成 sessionid 的数据保存到数据库:django_session 表中
    request.session['name'] = '阿宸'
    request.session['age'] = '27'
    # 设置过期时间 , 单位:秒
    request.session.set_expiry(60)
    return HttpResponse('设置 Session 数据')

def session_get(request):
    res = request.session.get('name')
    return HttpResponse(f'获取 Session 的数据为:{res}')

def session_del(request):
    # 清楚过期的 Session 数据
    # request.session.clear_expired()
    # del request.session['name']
    # 清空所有的数据
    # request.session.delete()
    request.session.flush()
    return HttpResponse('ok')

三、跨站点防御

CSRF:跨站点请求伪造

CSRF指攻击者盗用你的身份,以你的名义发送恶意请求(盗取你的账号 , 购买商品 , 窃取你的个人信息)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

防止 CSRF 的攻击,Django 在中间件中做了 CSRF 的预防机制。

浏览器第一次访问 服务端的时候,Django 会自动随机生成 token 数据以 Cookie 形式发送给浏览器。当浏览器发送了 post 请求的时候,服务端都会进行自动检查 token是否和保存的一致。以这种方式进行避免 csrf 的攻击。

Django 配置的 中间件的 CSRF 只对 post 请求有效,get 请求无效

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

maven远程仓库访问顺序

首先需要了解一下各个配置文件,主要分为三类: 全局配置文件(${maven.home}/conf/settings.xml),maven安装路径下的/conf/settings.xml用户配置文件(%USER_HOME%/.m2/settings.xml),windows用户文件夹下项目配置文件:p…

【JVM基础篇】类加载器分类介绍

文章目录 类加载器什么是类加载器类加载器的作用是什么应用场景类加载器的分类启动类加载器用户扩展基础jar包 扩展类加载器和应用程序类加载器扩展类加载器通过扩展类加载器去加载用户jar包: 应用程序加载器 Arthas中类加载器相关功能 文章说明 类加载器 什么是类…

【Gitlab远程访问本地仓库】Gitlab如何安装配置并结合内网穿透实现远程访问本地仓库进行管理

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 前言 GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具&#xf…

数据结构与算法学习笔记之线性表二---顺序表的静态存储表示和实现(C++)

目录 前言 1.什么是顺序表 2.顺序表的静态存储表示 1.初始化 2.长度 3.数据元素 4.长度 5.获取元素下标 6.前驱节点 7.后继节点 8.插入 9.删除 10.遍历 11.测试代码 前言 这篇文章讲的是顺序表的两种实现方式。 1.什么是顺序表 线性表的顺序表示指的是用一组地址…

用hMailServer+roundcubemail+宝塔安装配置一个自己的邮箱服务

用hMailServerroundcubemail安装配置一个自己的邮箱服务 1、准备工具与资料: 云服务器一台 基础配置就行 2核4G。域名一个 以下用lizipro.cn示例。hMailServer安装包roundcubemail安装包异常处理插件补丁: libmysql.zip 2、hMailServer服务安装&#…

通过内网穿透免费部署我们的springboot+vue项目 实现跟服务器一样的效果

前文讲到通过内网穿透能够实现远程访问个人电脑的静态资源。本文将讲解通过内网穿透实现远程访问本地的项目,实现跟部署到服务器一样的效果:前文链接:通过内网穿透实现远程访问个人电脑资源详细过程(免费)(…

MFC重要的初始化函数InitInstance

MFC应用程序最早处理的类的初始化函数通常是CWinApp类的构造函数。CWinApp类是MFC应用程序的主类,负责整个应用程序的初始化和管理。 在MFC应用程序中,通常会创建一个派生自CWinApp类的应用程序类,例如CMyApp。在应用程序启动时,…

MySQL——系统变量

使用 #最大连接用户数 select MAX_CONNECTIONS; #临时存放构成每次事务的SQL的缓冲区长度 select BINLOG_CACHE_SIZE; #SQL Server的版本信息 select VERSION; 查询结果

Linux实验 系统管理(三)

实验目的: 了解Linux系统下的进程;掌握一类守护进程——计划任务的管理;掌握进程管理的常用命令;掌握进程的前台与后台管理;了解Linux系统的运行级别;掌握系统服务管理的常用命令。 实验内容: …

可视化大屏:城市治理方向,三维地图那是相当震撼呀。

随着城市化进程的加快,城市治理变得越来越复杂,需要大量的数据和信息来支持决策和管理。在这个背景下,可视化大屏作为一种新兴的信息展示工具,正逐渐在城市治理中发挥着重要作用。 首先,可视化大屏能够将庞大的数据和信…

Web前端一套全部清晰 ⑧ day5 CSS.3 选择器、PxCook软件、盒子模型

谁不是一路荆棘而过呢 —— 24.5.12 CSS.3 选择器、PxCook软件、盒子模型 一、选择器 1.结构伪类选择器 1.作用: 根据元素的结构关系查找元素。 选择器 说明 E:first-child 查找第一个 E元素 E:last-child 查找最后一个E元素 E:nth-chil…

数据结构·一篇搞定栈!

好久不见,超级想念 废话不多说,直接看 引言 在数据结构的大家族中,栈(Stack)是一种非常重要的线性数据结构,它的特点是后进先出(LIFO,Last In First Out)。栈在程序设…

docker八大架构之单机架构

单机架构 什么是单机架构? 单机架构指的是应用服务和数据库服务公用同一台服务器。如下边两个图所示,当我们进行购物时,所有的物品信息和用户信息都是在同一个服务器下进行运行的,之所以称为单机架构就是因为它所有的操作是在同…

【AMBA Bus ACE 总线10 -- ACE Barrier transaction 详细介绍】

请阅读【AMBA Bus ACE 总线与Cache 专栏 】 欢迎学习:【嵌入式开发学习必备专栏】 文章目录 ACE AxBARAxBAR[1:0]的值及含义屏障的用途和重要性ACE AxBAR 用于表明是否是一个barrier 的transaction,对于它我们只需要有个简单的了解即可,现在已经不建议在transaction的层面上…

Unity VR在编辑器下开启Quest3透视(PassThrough)功能

现在有个需求是PC端串流在某些特定时候需要开启透视。我研究了两天发现一些坑,记录一下方便查阅,也给没踩坑的朋友一些思路方案。 先说结论,如果要打PC端或者在Unity编辑器中开启,那么OpenXR当前是不行的可能还需要一个长期的过程,必须需要切换到Oculus。当然Unity官方指…

异常处理/ROS2异常处理模块源码解读与浅析

文章目录 概述ros2/rcutils/src/error_handling模块自身异常处理错误状态结构与存储本模块初始化错误状态的设置错误状态的获取错误状态的清理不丢失旧错误状态把手段还原为目的其他 概述 本文从如下几个方面对 ROS2.0 中 rcutils 库 error_handling 错误处理模块的源码进行解…

整理好的中债国债3年期到期收益率数据集(2002-2023年)

01、数据简介 国债,又称国家公债,是由国家发行的债券,是中央ZF为筹集CZ资金而发行的一种ZF债券,是中央ZF向投资者出具的、承诺在一定时期支付利息和到期偿还本金的债权债务凭证。 中债,是指由中国中债登记结算有限责…

报表-接口类型的数据源

1、配置 在数据中进行如下配置 配置格式,换行的方式 #API $.data[0].children http://192.168.1.1:9200/apis/getInfo 行1:固定写法,标识这是一个接口类型的数据集 行2:JSONPath格式字符串,对接口的数据进行取值。…

轮转数组 与 消失的数字

轮转数组 思路一 创建一个新内存空间,将需轮转的数依次放入,之后在把其它数放入 代码: void rotate(int* nums, int numsSize, int k) {k k % numsSize;// 确定有效的旋转次数if(k 0)return;int* newnums (int*)malloc(sizeof(int) * nu…

Linux与Windows互传文件【笔记】

Linux与Windows互传文件【笔记】 前言前言推荐Linux与Windows互传文件首先确保Windows安装ssh如何传送文件问题 最后 前言 这是陈旧已久的草稿2023-05-10 00:01:24 这个是准备把计组课程华为智能计组的,传输文件。 最后发现,好像没有实现了。 现在202…