【Django】中间件
Django 中间件是 Django 框架里一个轻量级、可插拔的组件,它能在全局范围内对 Django 的请求和响应进行处理。中间件处于 Django 的请求处理流程之中,在请求抵达视图函数之前以及视图函数返回响应之后执行特定操作。以下是关于 Django 中间件的详细介绍:
一、详细介绍
工作原理
Django 中间件的工作流程是一个请求/响应处理的管道。当一个请求到达 Django 项目时,它会依次经过每个中间件的处理,这些处理可能包括对请求进行预处理、身份验证、日志记录等。在视图函数处理完请求并返回响应后,响应会再次经过中间件,不过这次是反向顺序,中间件可以对响应进行后处理,如添加响应头、压缩响应内容等。
中间件的作用
- 全局请求处理:可以对所有请求进行预处理,例如验证用户身份、检查请求来源等。
- 全局响应处理:对所有响应进行后处理,如添加通用的响应头、压缩响应内容等。
- 异常处理:捕获视图函数中抛出的异常,并进行统一处理。
- 性能监控:记录请求的处理时间,方便进行性能分析。
中间件的使用场景
- 身份验证和授权:在请求到达视图之前验证用户身份,确保只有授权用户可以访问某些视图。
- 日志记录:记录每个请求的详细信息,如请求时间、请求路径、请求参数等,方便后续的调试和分析。
- 缓存控制:设置响应头,控制浏览器和缓存服务器对响应的缓存策略。
- 跨域资源共享(CORS):处理跨域请求,允许不同域名的页面访问当前网站的资源。
中间件的实现方式
在 Django 中,中间件可以通过以下几种方式实现:
函数式中间件
函数式中间件是最简单的中间件实现方式,它是一个接受 get_response
函数作为参数的函数,返回一个新的函数,该函数处理请求和响应。
def simple_middleware(get_response):def middleware(request):# 请求处理前的逻辑print("Before view is called")response = get_response(request)# 请求处理后的逻辑print("After view is called")return responsereturn middleware
类式中间件
类式中间件是更灵活的实现方式,它通过定义一个类来实现中间件的功能。类中需要实现 __init__
和 __call__
方法。
class SimpleMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):# 请求处理前的逻辑print("Before view is called")response = self.get_response(request)# 请求处理后的逻辑print("After view is called")return response
中间件的配置
要使用自定义的中间件,需要将其添加到 Django 项目的 settings.py
文件中的 MIDDLEWARE
设置中。中间件的顺序很重要,请求会按照 MIDDLEWARE
列表中的顺序依次经过每个中间件,而响应则会按照相反的顺序经过中间件。
MIDDLEWARE = [# 其他中间件...'myapp.middleware.SimpleMiddleware',
]
内置中间件
Django 提供了一些内置的中间件,这些中间件可以直接在项目中使用,常见的内置中间件包括:
django.middleware.security.SecurityMiddleware
:提供一些基本的安全功能,如安全头设置、HTTP 严格传输安全(HSTS)等。django.contrib.sessions.middleware.SessionMiddleware
:处理会话功能,允许在不同请求之间存储和访问用户数据。django.contrib.auth.middleware.AuthenticationMiddleware
:将用户对象附加到每个请求上,方便在视图中使用request.user
来获取当前用户。django.middleware.csrf.CsrfViewMiddleware
:提供跨站请求伪造(CSRF)保护。
通过使用中间件,你可以在不修改视图函数的情况下,对整个 Django 项目的请求和响应进行统一处理,提高代码的可维护性和复用性。
二、多个中间件的执行顺序
Django 中间件的执行顺序是理解其工作原理的关键部分,下面为你详细且形象地介绍多个中间件的执行顺序。
整体流程概述
当一个请求进入 Django 应用时,它会像一个“旅行者”一样,依次经过 MIDDLEWARE
设置列表里的各个中间件,这个过程就像是旅行者依次穿过不同的“关卡”。在每个关卡,中间件可以对请求进行检查、修改等操作。当请求到达视图函数并得到响应后,响应又会沿着相反的方向,再次穿过这些“关卡”,只不过这次是从最后一个中间件开始,逐个往前处理,每个中间件可以对响应进行后处理。
执行顺序的形象比喻
假设你要去一个神秘的城堡参观,这个城堡有很多道“魔法门”,每道魔法门都有不同的魔法效果,这些魔法门就相当于 Django 中的中间件。
请求阶段
当你从城堡外走向城堡内部(请求进入)时,你需要依次穿过这些魔法门。每穿过一道门,门的魔法就会作用在你身上,比如给你一个特殊的标记、检查你的身份等。这个过程就如同请求依次经过 MIDDLEWARE
列表中的中间件,每个中间件对请求进行预处理。
视图处理阶段
当你穿过所有的魔法门后,就进入了城堡的核心区域(视图函数),在这里你可以完成你的参观任务(处理请求),并得到一些纪念品(生成响应)。
响应阶段
当你参观结束,要离开城堡时,你需要再次穿过这些魔法门,但这次是反向的。每穿过一道门,魔法门又会对你身上的纪念品进行一些处理,比如给纪念品添加一个封印、改变纪念品的外观等。这个过程就如同响应依次经过中间件,每个中间件对响应进行后处理。
代码示例与执行顺序说明
假设我们有三个中间件 MiddlewareA
、MiddlewareB
和 MiddlewareC
,并且在 settings.py
中的 MIDDLEWARE
设置如下:
MIDDLEWARE = ['myapp.middleware.MiddlewareA','myapp.middleware.MiddlewareB','myapp.middleware.MiddlewareC',
]
下面是这三个中间件的简单实现:
# myapp/middleware.py
class MiddlewareA:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):print("MiddlewareA: Before view")response = self.get_response(request)print("MiddlewareA: After view")return responseclass MiddlewareB:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):print("MiddlewareB: Before view")response = self.get_response(request)print("MiddlewareB: After view")return responseclass MiddlewareC:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):print("MiddlewareC: Before view")response = self.get_response(request)print("MiddlewareC: After view")return response
当一个请求到达时,控制台的输出顺序如下:
MiddlewareA: Before view
MiddlewareB: Before view
MiddlewareC: Before view
# 视图函数处理请求
MiddlewareC: After view
MiddlewareB: After view
MiddlewareA: After view
从输出可以看出,请求按照 MIDDLEWARE
列表中的顺序依次经过 MiddlewareA
、MiddlewareB
和 MiddlewareC
的“请求预处理”部分,然后进入视图函数处理请求。视图函数返回响应后,响应按照相反的顺序经过 MiddlewareC
、MiddlewareB
和 MiddlewareA
的“响应后处理”部分。
顺序的重要性
中间件的顺序非常重要,因为它会影响到中间件的执行效果。例如,身份验证中间件通常需要放在其他需要用户身份信息的中间件之前,这样才能确保在后续中间件执行时,用户身份已经验证通过。如果顺序设置不当,可能会导致中间件无法正常工作,或者出现安全漏洞。
综上所述,理解 Django 中间件的执行顺序对于正确使用中间件和构建高效的 Django 应用至关重要。
三、MiddlewareMixin
MiddlewareMixin
是 Django 框架里的一个实用工具类,它的主要作用是简化中间件的创建过程。下面从多个方面对其进行详细介绍。
用途
在 Django 早期版本中,创建中间件的方式较为复杂,需要手动处理中间件的初始化和请求响应的调用逻辑。而 MiddlewareMixin
则是 Django 为了简化中间件的编写而引入的一个基类,借助它能够更便捷地创建中间件。
工作原理
MiddlewareMixin
是一个实现了特定逻辑的基类,它提供了中间件所需的基本结构。当你让自定义中间件继承自 MiddlewareMixin
时,就能利用其已经实现好的初始化和请求响应处理逻辑,从而减少代码量。
使用方法
以下是使用 MiddlewareMixin
创建中间件的示例:
from django.utils.deprecation import MiddlewareMixinclass SimpleMiddleware(MiddlewareMixin):def process_request(self, request):# 请求处理前的逻辑print("Before view is called")def process_response(self, request, response):# 请求处理后的逻辑print("After view is called")return response
在这个例子里,SimpleMiddleware
继承自 MiddlewareMixin
,并且实现了两个方法:
process_request(request)
:此方法会在请求到达视图之前被调用,可用于对请求进行预处理,像验证用户身份、记录请求日志等操作。process_response(request, response)
:该方法会在视图返回响应之后被调用,可用于对响应进行后处理,比如添加响应头、压缩响应内容等操作。
完整示例
假设你要在项目中使用这个中间件,需要完成以下步骤:
- 创建中间件文件:在你的应用(例如
myapp
)下创建一个middleware.py
文件,并把上述中间件代码添加进去。 - 配置中间件:在
settings.py
文件的MIDDLEWARE
设置里添加自定义中间件的路径。
MIDDLEWARE = [# 其他中间件...'myapp.middleware.SimpleMiddleware',
]
注意事项
- Django 版本差异:在 Django 1.10 及之后的版本中,
MiddlewareMixin
被用来兼容旧的中间件写法。从 Django 2.0 开始,中间件可以通过实现__call__
方法来创建,这种方式更为简洁。示例如下:
class NewStyleMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):# 请求处理前的逻辑print("Before view is called")response = self.get_response(request)# 请求处理后的逻辑print("After view is called")return response
- 执行顺序:中间件的执行顺序由
MIDDLEWARE
设置列表中的顺序决定。请求会按照列表顺序依次经过各个中间件的process_request
方法,而响应则会按照相反顺序经过各个中间件的process_response
方法。
总结
MiddlewareMixin
是 Django 提供的一个用于简化中间件编写的工具类,它让开发者可以通过实现 process_request
和 process_response
方法来创建中间件。不过,随着 Django 版本的更新,新的中间件创建方式逐渐流行,你可以根据项目需求和 Django 版本选择合适的方式。
相关文章:
【Django】中间件
Django 中间件是 Django 框架里一个轻量级、可插拔的组件,它能在全局范围内对 Django 的请求和响应进行处理。中间件处于 Django 的请求处理流程之中,在请求抵达视图函数之前以及视图函数返回响应之后执行特定操作。以下是关于 Django 中间件的详细介绍&…...
电子电器架构 --- 48V架构的一丢丢事情
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...
什么是Blender?怎么获取下载Blender格式文件模型
glbxz.com glbxz.com 官方可以下载Blender格式文件模型 BlenderBlender 是一个免费的开源程序,用于建模和动画,最初由一家名为 Neo Geo 的动画工作室作为内部应用程序开发,后来作为自己的程序发布。这是一个称职的程序,近年来由于…...
Ubuntu安装pgsql
一、通过 APT 安装(推荐) 更新软件包列表 sudo apt update 安装 PostgreSQL 核心包及工具 sudo apt install postgresql postgresql-client postgresql-contrib • postgresql:数据库服务端 • postgresql-client:命令行…...
Qwen2-VL详解
一、引言 在人工智能领域,多模态大模型的发展备受关注。Qwen2-VL 作为一款先进的多模态模型,致力于克服现有方法在处理图像和视频数据时存在的不足,显著提升多模态信息的理解与交互能力。本文将全面且深入地阐述 Qwen2-VL 的创新理念、精妙的模型架构、严谨的训练流程、卓越…...
定长滑动窗口---初阶篇
目录 滑动窗口核心思想 定长滑动窗口套路 定长滑动窗口习题剖析 1456. 定长子串中元音的最大数目 643. 子数组最大平均数 I 1343. 大小为 K 且平均值大于等于阈值的子数组数目 2090. 半径为 k 的子数组平均值 2379. 得到 K 个黑块的最少涂色次数 2841. 几乎唯一子数组…...
以pytest_addoption 为例,讲解pytest框架中钩子函数的应用
钩子函数(Hook Function)的概念 钩子函数(Hook Function)是软件框架中预定义的回调接口,允许开发者在程序执行的特定阶段插入自定义逻辑,以扩展或修改框架的默认行为。在 pytest 中,钩子函数覆…...
数据智能重塑工业控制:神经网络在 MPC 中的四大落地范式与避坑指南
一、引言:工业控制的范式革命 在工业 4.0 的浪潮中,传统基于物理模型的控制方法(如 PID、线性二次型调节器 LQR)正面临前所未有的挑战。以石化行业为例,某炼油厂的催化裂化装置(FCCU)因反应机理…...
AB测试面试题
AB测试面试题 常考AB测试问答题(1)AB测试的优缺点是什么?(2)AB测试的一般流程/介绍一下日常工作中你是如何做A/B实验的?(3)第一类错误 vs 第二类错误 vs 你怎么理解AB测试中的第一、二类错误?(4)统计显著=实际显著?(5)AB测试效果统计上不显著?(6)实验组优于对…...
phpstudy升级新版apache
1.首先下载要升级到的apache版本,这里apache版本为Apache 2.4.63-250207 Win64下载地址:Apache VS17 binaries and modules download 2.将phpstudy中原始apache复制备份Apache2.4.39_origin 3.将1中下载apache解压, 将Apache24复制一份到ph…...
民宿管理系统6
普通管理员管理: 新增普通管理员: 前端效果: 前端代码: <body> <div class"layui-fluid"><div class"layui-row"><div class"layui-form"><div class"layui-f…...
【iOS】源码阅读(三)——内存对齐原理
文章目录 前言获取内存大小的三种常用方式sizeofclass_getInstanceSizemalloc_size 总结 前言 之前学习alloc相关源码,涉及到内存对齐的相关内容,今天笔者详细学习了一下相关内容并写了此篇博客。 获取内存大小的三种常用方式 获取内存大小的方式有很多…...
在 Ubuntu 中配置 Samba 实现「特定用户可写,其他用户只读」的共享目录
需求目标 所有认证用户可访问 Samba 共享目录 /path/to/home;**仅特定用户(如 developer)**拥有写权限;其他用户仅允许读取;禁止匿名访问。 配置步骤 1. 设置文件系统权限 将目录 /home3/guest 的所有权设为 develo…...
配置指定地址的conda虚拟Python环境
创建指定路径的 Conda 环境 在创建环境时,使用 --prefix 参数指定自定义路径: conda create --prefix/your/custom/path/my_env python3.8 说明: /your/custom/path/my_env:替换为你希望存放环境的路径(如 D:\projec…...
从彼得·蒂尔四象限看 Crypto「情绪变迁」:从密码朋克转向「标准化追求者」
作者:Techub 精选编译 撰文:Matti,Zee Prime Capital 编译:Yangz,Techub News 我又带着一篇受彼得蒂尔(Peter Thiel)启发的思想杂烩回来了。作为自封的「蒂尔学派」信徒,我常透过他…...
VS Code 常用插件
React Auto Import - ES6, TS, JSX, TSX Auto Rename Tag ES7 React/Redux/React-Native snippets Markdown Markdown All in One Markdown Preview Enhanced Other Prettier - Code formatter 格式化代码 Live Server 本地服务器实时预览与自动刷新...
深入探讨 UDP 协议与多线程 HTTP 服务器
深入探讨 UDP 协议与多线程 HTTP 服务器 一、UDP 协议:高效但“不羁”的传输使者 UDP 协议以其独特的特性在网络传输中占据一席之地,适用于对实时性要求高、能容忍少量数据丢失的场景。 1. UDP 的特点解析 无连接:无需提前建立连接&…...
Node.js入门指南:开启JavaScript全栈开发之旅
Hi,我是布兰妮甜 !Node.js让JavaScript突破了浏览器的限制,成为全栈开发的利器。作为基于V8引擎的高性能运行时,它彻底改变了JavaScript只能做前端开发的局面。本文将带你快速掌握Node.js的核心用法:环境搭建与模块系统…...
【STM32F1标准库】理论——通信协议:串口
目录 一、简介 二、连接方式 三、串口参数与时序 1.参数 2.时序 四、STM32实现串口通信的方法 1.使用软件模拟 2.使用硬件外设 杂谈 1.通信的目的 2.常见可以使用串口通信的模块 3.串口常用电平标准 4.串口从波形反推数据 5.奇偶校验 一、简介 命名:USART&#…...
轻松管理房间预约——启辰智慧预约小程序端使用教程
欢迎您使用《启辰智慧预约》场所预约小程序,您可以通过本小程序预约会议室/活动室等,并在预约审批通过后,获取临时开锁密码,开锁密码会在预约时间前30分钟生效。以下是本程序的使用流程。 一、创建单位(新用户注册&am…...
如何在自己的服务器上部署静态网页并通过IP地址进行访问
文件放置 cd /var目录 新建www目录 进入www目录 新建html目录用于放置文件以及相关资源 修改配置文件 sudo nano /etc/nginx/sites-available/default修改index部分的html文件名 修改端口映射避免80冲突 重启Nginx sudo systemctl restart nginx打开浏览器访问即可 h…...
802.11s Mesh 组网框架流程
协议标准 使用 802.11s (标准 Mesh 协议) 基础流程框架 连接流程本质:Beacon → Peer Link → HWMP 路径发现 → 数据传输。mesh与easymesh的区别 阶段详解 阶段1:Beacon广播 作用:周期性宣告Mesh网络存在,同步参数(如Mesh …...
gitcode 上传文件报错文件太大has exceeded the limited size (10 MiB) in commit
登陆gitcoe,在项目设置->提交设置 ,勾选提交文件限制,修改限制的大小。 修改完后,重新提交代码。...
C++代码随想录刷题知识分享-----判断两个字符串是否为字母异位词(Anagram)【LeetCode 242】
✨ 题目描述 给定两个字符串 s 和 t,请判断 t 是否是 s 的字母异位词。 📌 示例 1: 输入:s "anagram", t "nagaram" 输出:true📌 示例 2: 输入:s "…...
Canal mysql to mysql 增加 online 库同步配置指南
Canal 增加新库 online 的配置指南 1. 停止 Canal Adapter 服务 ./bin/stop.sh2. 数据库备份与导入 备份源数据库 mysqldump -h 127.0.0.1 -P 3307 --single-transaction -uroot -p -B online > online.sql导入到目标数据库 mysql -h 127.0.0.1 -P 3308 -uroot -p <…...
Spring MVC中Controller是如何把数据传递给View的?
在 Spring MVC 中,Controller 负责请求的处理,准备需要展示的数据,并将这些数据传递给 View,由 View 负责最终的页面渲染。数据从 Controller 传递到 View 主要通过模型 (Model) 实现。 Spring MVC 提供了以下几种方式让 Control…...
FAST-LIO笔记
1.FAST-LIO FAST-LIO 是一个计算效率高、鲁棒性强的激光-惯性里程计系统。该系统通过紧耦合的迭代扩展卡尔曼滤波器(IEKF)将激光雷达特征点与IMU数据进行融合,使其在快速运动、噪声较大或环境复杂、存在退化的情况下仍能实现稳定的导航。 1…...
挑战用豆包教我学Java01天
今天是豆包教我学Java的第一天,废话不多说直接开始。 1.每日题目: 基础语法与数据类型 题目:编写一个 Java 程序,从控制台读取两个整数,然后计算它们的和、差、积、商,并输出结果。题目:编写…...
基于RT-Thread的STM32G4开发第二讲第二篇——ADC
文章目录 前言一、RT-Thread工程创建二、ADC工程创建三、ADC功能实现1.ADC.c2.ADC.h3.mian.c 四、效果展示和工程分享总结 前言 本文使用的是RT-Thread最新的驱动5.1.0,兼容下面的所有驱动。使用的开发板是蓝桥杯嵌入式国信长安的开发板,MCU是STM32G431…...
居民健康监测小程序|基于微信小程序的居民健康监测小程序设计与实现(源码+数据库+文档)
居民健康监测小程序 目录 基于微信小程序的居民健康监测小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、健康科普管理 5.3公告类型管理 3、论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 …...
电商双11美妆数据分析
图中展示的是在Jupyter Notebook环境下的Python代码及运行结果。代码利用 seaborn 和 matplotlib 库,以 datal 数据集为基础,绘制上下两个子图。上方子图呈现各店铺中各大类的销售量,下方子图展示各店铺中各大类的销售额,通过条形…...
Spark-Core(双Value类型)
一、RDD转换算子(双Value类型) 1、intersection 函数签名: def intersection(other: RDD[T]): RDD[T] 函数说明:对源 RDD 和参数 RDD 求交集后返回一个新的 RDD 举栗: val dataRDD1 sparkContext.makeRDD(List(…...
【数据库原理及安全实验】实验六 角色访问控制
指导书原文 安全性管理二 【实验目的】 1) 通过语句设置登录用户的权限,实现对不同用户的操作权限的限定。 【实验原理】 1) 定义数据库角色,授予该角色特定权限,建立不同的用户将其置入不同的角色之下,即等于分配了该用户不…...
windows安装micromamba
windows安装 winget install Mamba.Micromamba Set-ExecutionPolicy RemoteSigned micromamba activate 第一次运行会报错,把报错中间那一句init代码跑一下 创建环境什么的和conda一样 把conda换成micromamba就行 绑定快捷键,winget安装&#x…...
vue-quill-editor的失焦事件
vue-quill-editor的用法再此就不再赘述了,只记录我在使用过程中踩的坑。 版本:Vue2 vue-quill-editor3.0.6 封装组件: <vue-quill-editorclass"editor":class"dynamicClasses"ref"myTextEditor"v-model&quo…...
【工具变量】最新华证ESG评级得分数据-含xlsx及dta格式(2009-2024.12)
参考《经济研究》中方先明(2023)的做法,将华证ESG评级进行赋值,指标包含C、CC、CCC、B、BB、BBB、A、AA、AAA共9个等级,将上市公司ESG等级从低到高分别赋值为1至9。将华证ESG评级得分数据更新至2024年12月31日…...
【纯小白博客搭建】Hugo+Github博客部署及主题(stack)美化等界面优化记录
这里写目录标题 HugoGithub博客部署及主题(stack)美化等界面优化写在前面hugo博客搭建教程第一种方案第二种方案 添加浏览量和统计字数添加评论功能添加访客地图 HugoGithub博客部署及主题(stack)美化等界面优化 效果图如下 如果…...
题解:CF2107E Ain and Apple Tree
首先考虑无解的情况。 当这棵树为一条链时,答案取到最大值。证明很简单,假设存在一个节点 u u u 至少有 2 2 2 个孩子节点,任取两个 v 1 , v 2 v_1,v_2 v1,v2,则 dep ( LCA ( v 1 , v 2 ) ) dep ( u ) \text{dep}(\o…...
STM32的看门狗
独立看门狗(IWDG) IWDG简介 独立看门狗(Independent Watchdog,通常缩写为IWDG)主要作用是主要用于检测外界电磁干扰,或硬件异常导致的程序跑飞问题。 WDG本质上是一个12位的递减计数器(滴答定…...
小王包子铺的融资过程以及IPO上市过程
用包子铺来打个通俗易懂的比喻,一步步讲清楚从创业到融资上市的全过程。 🥟 故事背景:老王的包子铺 老王做的包子特别好吃,于是他决定不再只是摆摊,而是创办一家叫 “老王包子铺” 的连锁店。我们就以老王创业为线索&…...
WPF 触发器 Trigger
触发器 Trigger 触发器(Trigger)是 WPF 中的一种机制: 当某个条件满足时,自动改变控件的某些属性,比如颜色、大小、透明度等。 换句话说,就是"如果……那么就……" 的一种规则。 常见触发器类…...
CentOS算法部署
CentOS服务部署 第一章 启动两个算法服务第一步:上传算法文件第二步:安装 tmux第三步:启动服务(1) 启动第一个算法服务(2) 启动第二个算法服务 第四步:关闭防火墙 第一章 启动两个算…...
极狐GitLab 命名空间的类型有哪些?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 命名空间 命名空间在极狐GitLab 中组织项目。因为每一个命名空间都是单独的,您可以在多个命名空间中使用相同的项…...
使用 Apache POI 生成包含文本和图片的 Word 文档
一、概述 在实际开发场景中,我们经常需要自动生成包含文本和图片的 Word 文档。本示例借助 Apache POI 库,实现了向 Word 文档中插入文本和图片的功能。代码会循环插入多次文本和同一张图片,并且对图片进行等比缩放处理,以保证图片…...
Eclipse通过Tomcat启动web项目报错
错误内容:Caused by: java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext。 本来运行的好好的,执行了Maven->Update Porject后就报上面的错。 通过检查发现,执行上面的命令后会将下面截图中的maven depen…...
5.7线性动态规划1
P2285 [HNOI2004] 打鼹鼠 #include<bits/stdc.h> using namespace std; struct node{int x, y, t; }a[100010]; int dp[100010]; void solve(){int n, m; cin >> n >> m;for(int i 1; i < m; i){cin >> a[i].t >> a[i].x >> a[i].y;}…...
Word如何制作三线表格
1.需求 将像这样的表格整理成论文中需要的三线表格。 2.直观流程 选中表格 --> 表格属性中的边框与底纹B --> 在设置中选择无(重置表格)–> 确定 --> 选择第一行(其实是将第一行看成独立表格了,为了设置中线&…...
【Mybatis-plus常用语法】
MyBatis-Plus 是 MyBatis 的增强工具,提供了很多便捷的功能来简化开发。以下是一些 MyBatis-Plus 的常见语法: 实体类注解:使用 TableName 注解来指定实体类和数据库表的映射关系。 TableName("user") public class User {privat…...
16.Excel:数据收集
一 使用在线协作工具 简道云。 excel的在线表格协作在国内无法使用,而数据采集最需要在线协作。 二 使用 excel 1.制作表格 在使用excel进行数据采集的时候,会制作表头给填写人,最好还制作一个示例。 1.输入提示 当点击某个单元格的时候&am…...
基于Django框架开发的企业级IT资产管理系统
CMDB 资产管理系统 资产管理系统是一个基于Django框架开发的企业级IT资产管理平台,专注于数据中心和IT设备的全生命周期管理。该系统提供了完整的资产管理功能,包括设备管理、数据中心管理、用户权限管理等核心功能。 项目截图 技术栈 后端 Python 3…...