当前位置: 首页 > news >正文

Django开发之进阶篇

Django进阶篇

  • 一、Django学习之模板
  • 二、Django学习之中间件
    • 默认中间件
    • 自定义中间件
  • 三、Django学习之ORM
    • 定义模型类
    • 生成数据库表
    • 操作数据库
      • 添加
      • 查询
      • 修改
      • 删除


一、Django学习之模板

在 Django 中,模板(Template)是用于生成动态 HTML(或其他格式的文档)的文件,它允许你将数据与 HTML 结构分离,从而实现更好的代码组织和可维护性。

要在django框架中使用模板引擎把视图中的数据更好的展示给客户端,需要完成3个步骤:

  1. 在项目配置文件中指定保存模板文件的模板目录。一般模板目录都是设置在项目根目录或者主应用目录下。
  2. 在视图中基于django提供的渲染函数绑定模板文件和需要展示的数据变量
  3. 在模板目录下创建对应的模板文件,并根据模板引擎内置的模板语法,填写输出视图传递过来的数据。

配置模板目录:在当前项目根目录下创建了模板目录templates. 然后在settings.py, 模板相关配置,找到TEMPLATES配置项,填写DIRS设置模板目录。

TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR,'templates')],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},
]
  • 模板文件:模板文件是包含 HTML 结构和嵌入模板标签的文件。这些模板标签被 Django 解释器识别,并用于插入动态内容和逻辑。通常,模板文件以 .html 扩展名保存,但也可以使用其他扩展名。

  • 模板语言:Django 使用自己的模板语言,其中包含了一系列模板标签和过滤器,用于处理数据、控制流程和生成动态内容。模板语言允许你在模板中插入变量、执行条件判断和循环等操作。

  • 加载模板:在视图函数中,你可以使用 render() 函数来加载和渲染模板。这个函数接受一个请求对象、模板文件的路径和一个上下文字典作为参数,然后将模板渲染为 HTML,并返回一个包含渲染结果的 HttpResponse 对象。

    from django.shortcuts import renderdef my_view(request):data = {'name': 'John'}return render(request, 'my_template.html', context=data)
  • 模板标签:模板标签是以 {% … %} 包围的代码块,用于在模板中执行逻辑控制和循环操作。常见的模板标签包括:

    {% for … %} … {% endfor %}:用于循环遍历列表或查询结果。
    {% if … %} … {% elif … %} … {% else %} … {% endif %}:用于条件判断。
    {% block … %} … {% endblock %}:用于定义和重写块内容。
    {% include … %}:用于在模板中包含其他模板。

  • 模板变量:模板变量是以 {{ … }} 包围的代码块,用于插入动态数据到模板中。你可以在模板中使用上下文中的变量,如 {{ name }},以显示用户的名称。

  • 模板过滤器:模板过滤器是可用于修改变量的方法。你可以在变量后面使用管道符 | 来应用过滤器。例如,{{ value|filter_name }}。Django 提供了许多内置过滤器,如 date、truncatechars、lower 等。
    在这里插入图片描述

  • 模板继承:Django 允许你创建模板的基础布局,并在子模板中继承和扩展它。这可以通过 {% extends … %} 和 {% block … %} 标签来实现。模板继承使你可以重用通用布局,并在不同页面中插入不同的内容。

  • 模板标记:除了模板标签和变量外,你还可以在模板中使用模板标记(Template Tags),这是自定义的模板标签和过滤器。你可以编写自定义模板标记来执行复杂的逻辑操作或呈现特定的内容。

    创建文件夹 templatetags (view.py 同级目录,必须是这个名称)
    templatetags目录下创建分别创建__init__.py 和 custom_filter.py(可以自定义)
    在custom_filter.py 写入如下模板

    from django import templateregister = template.Library()# 我这里以自定义电话过滤器举例
    @register.filter
    def phone_num_filter(value):# 18720359678 > 187 **** 9678return f"{value[:3]} **** {value[7:]}"
    

    编写模板文件
    开头导入 {% load custom_filter %}

    {% load custom_filter %}
    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>电话薄</title>
    </head>
    <body>
    <table border="0" align="center" width="300px;"><tr><th>姓名</th><th>性别</th><th>联系方式</th></tr>{% for p in person_list%}<tr><td>{{ p.name }}</td><td>{{ p.phone_num | phone_num_filter }}</td><td>{{ p.sex }}</td></tr>{% endfor%}</table>
    </body>
    </html>
    

二、Django学习之中间件

Django 中的中间件是一种机制,用于在请求和响应之间执行额外的处理操作。中间件可以在 Django 处理请求的不同阶段介入,允许你对请求和响应进行修改、记录、验证等操作。

在这里插入图片描述

默认中间件

MIDDLEWARE = ['django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]
  1. django.middleware.security.SecurityMiddleware:
    这个中间件负责提供一些与安全相关的功能,例如设置HTTP头部中的安全策略、强制使用HTTPS等。
  2. django.contrib.sessions.middleware.SessionMiddleware:
    这个中间件处理会话数据。它为每个请求提供了一个会话对象,可以用于在请求之间存储和检索数据。
  3. django.middleware.common.CommonMiddleware:
    这个中间件提供了一些常见的Web开发功能,如URL重写、缓存控制等。
  4. django.middleware.csrf.CsrfViewMiddleware:
    这个中间件用于处理跨站请求伪造(CSRF)保护。它在提交表单数据时验证CSRF令牌,以防止恶意站点利用用户的身份执行恶意操作。
  5. django.contrib.auth.middleware.AuthenticationMiddleware:
    这个中间件处理用户身份验证。它在请求过程中检查用户是否已通过身份验证,并将用户对象添加到请求的上下文中。
  6. django.contrib.messages.middleware.MessageMiddleware:
    这个中间件处理闪存消息。闪存消息是一种在请求之间传递的临时消息,通常用于显示一次性的成功消息、错误消息或其他通知。
  7. django.middleware.clickjacking.XFrameOptionsMiddleware:
    这个中间件提供了点击劫持(clickjacking)保护。它通过设置X-Frame-Options响应头来防止将网站嵌入到其他网页的iframe中,从而防止点击劫持攻击。

自定义中间件

中间件可以定义的四个方法,分别是

process_request(self, request)
process_view(self, request, view_func, view_args, view_kwargs)
process_exception(self, request, exception)
process_response(self, request, response)
  1. 创建中间件文件:在Django根目录创建一个新的文件夹(middlewares),然后在文件夹中创建一个新的Python文件
  2. 导入MiddlewareMixin类,在中间件,导入django.utils.deprecation.MiddlewareMinxin类
  3. 定义中间件类:创建一个新的类,继承自MiddlewareMixin类,并实现对应方法。
    ● def process_request(self, request): 在每个请求处理之前调用,可以在这里执行一些预处理操作。
    ● def process_response(self, request, response):在每个请求处理完成后调用,可以在这里执行一些后处理操作,并返回响应对象。
  4. 配置中间件顺序,打开项目的setting.py文件,找到MIDDLEWARE列表,将自定义中间件的完整路径添加到列表中,并根据需要调整中间件的顺序。
  5. 配置完成,保存文件重启Django开发服务器。

三、Django学习之ORM

Django 的 ORM(Object-Relational Mapping)是一个强大的工具,用于将 Python 对象映射到数据库表,允许你使用 Python 代码来执行数据库操作,而不必直接编写 SQL 查询语句。

定义模型类

在 Django 中,数据库表的结构和字段都是通过 Python 类来定义的,这些 Python 类通常称为模型类(Model)。
通过继承 django.db.models.Model 类来创建模型类,并在类中定义表的字段,字段的类型以及其他选项。
在这里插入图片描述
在这里插入图片描述
需求:通过模型类,生成一个用户表。
字段有:账号、密码、状态、电话、邮箱、创建时间、性别。

from django.db import models# Create your models here.class User(models.Model):STATUS_CHOICES = ((0, '正常'),(1, '封号'))GENDER_CHOICES = ((0, '女'),(1, '男'))username = models.CharField(max_length=30, null=True)password = models.CharField(max_length=30, null=True)status = models.CharField(max_length=1, choices=STATUS_CHOICES, default=0)gender = models.CharField(max_length=1, choices=GENDER_CHOICES, default=0)phone = models.CharField(max_length=11)email = models.EmailField()created_time = models.DateTimeField(auto_now=True)class Meta:db_table = "django_user"

生成数据库表

一旦定义了模型类,你可以使用 Django 的 makemigrations 和 migrate 命令来创建和更新数据库表。

python manage.py makemigrations
python manage.py migrate

在这里插入图片描述

操作数据库

一旦模型类和数据库表创建好,你可以使用模型类来进行数据库操作,如插入、查询、更新和删除记录。
创建book的模型类,数据迁移生成数据表。

from django.db import modelsclass Book(models.Model):id = models.AutoField(primary_key=True, verbose_name="book_id")title = models.CharField(max_length=32, verbose_name="书名")author = models.CharField(max_length=10, verbose_name="作者", null=True)state = models.BooleanField(verbose_name="状态")published_date = models.DateField(verbose_name="出版时间")price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name="价格")publishers = models.CharField(max_length=32, verbose_name="出版商")class Meta:db_table = "django_book"

python manage.py makemigrations
python manage.py migrate

这里利用Django中单元测试来说明,生成的数据都是测试数据,不会写入数据库。
在manage.py 文件终端下 运行 python manage.py test app.tests
在这里插入图片描述

添加

# -*- coding: utf-8 -*-
from django.test import TestCase
from .models import Bookclass BookTestcase(TestCase):def setUp(self) -> None:# 添加书籍# 方式一book_obj1 = Book.objects.create(title="雪山大地",author="杨志军",state=1,published_date="2023-02-01",price=78,publishers="作家出版社")# 方式二book_obj2 = Book(title="寻觅意义",author="王德峰",state=1,published_date="2022-10-01",price=49.80,publishers="山东文艺出版社")book_obj2.save()def test_book_query(self):book_result1 = Book.objects.filter(title="雪山大地")self.assertEqual("杨志军", book_result1.first().author)book_result2 = Book.objects.filter(title="寻觅意义")self.assertEqual('王德峰', book_result2.first().author)

查询

# -*- coding: utf-8 -*-
from django.test import TestCase
from .models import Bookclass BookTestcase(TestCase):def setUp(self) -> None:# 添加书籍book_data_info = [{"title": "寻觅意义","author": "王德峰","state": 1,"published_date": "2022-10-01","price": 49.80,"publishers": "山东文艺出版社"},{"title": "国画","author": "王跃文","state": 1,"published_date": "2023-06-01","price": 69.80,"publishers": "湖南文艺出版社"},{"title": "鳄鱼","author": "莫言","state": 1,"published_date": "2023-06-01","price": 99.80,"publishers": "浙江文艺出版社"},{"title": "长安的荔枝","author": "马伯庸","state": 1,"published_date": "2022-10-01","price": 66.66,"publishers": "湖南文艺出版社"},]# 通过解包的方式传入for book_data in book_data_info:Book.objects.create(**book_data)def test_book_query(self):# 基本查询book_result1 = Book.objects.filter(title="长安的荔枝")self.assertEqual("马伯庸", book_result1.first().author)book_result2 = Book.objects.filter(title="寻觅意义")self.assertEqual('王德峰', book_result2.first().author)def test_book_fuzzy_query(self):# 下划线模糊查询# 查询价格大于50的书的名称fuzzy_query_obj1 = Book.objects.filter(price__gt=50)book_list = []for f in fuzzy_query_obj1.values():book_list.append(f.get("title"))# 验证超过50的数为3本self.assertEqual(3, len(book_list))# 查询湖南开头的出版社的数量,验证为2fuzzy_query_obj2 = Book.objects.filter(publishers__startswith="湖南")self.assertEqual(2, fuzzy_query_obj2.count())

修改

# -*- coding: utf-8 -*-
from django.test import TestCase
from .models import Bookclass BookTestcase(TestCase):def setUp(self) -> None:# 添加书籍book_data_info = [{"title": "寻觅意义","author": "王德峰","state": 1,"published_date": "2022-10-01","price": 49.80,"publishers": "山东文艺出版社"},{"title": "国画","author": "王跃文","state": 1,"published_date": "2023-06-01","price": 69.80,"publishers": "湖南文艺出版社"},{"title": "鳄鱼","author": "莫言","state": 1,"published_date": "2023-06-01","price": 99.80,"publishers": "浙江文艺出版社"},{"title": "长安的荔枝","author": "马伯庸","state": 1,"published_date": "2022-10-01","price": 66.66,"publishers": "湖南文艺出版社"},]# 通过解包的方式传入for book_data in book_data_info:Book.objects.create(**book_data)def test_book_update(self):# 更新# 将鳄鱼这边书的出版时间改为2023-08-01update_time = "2023-08-01"Book.objects.filter(title="鳄鱼").update(published_date=update_time)# 查询是否更新成功book_publisher_date = Book.objects.filter(title="鳄鱼").first().published_dateself.assertEqual(update_time, str(book_publisher_date))

删除

# -*- coding: utf-8 -*-
from django.test import TestCase
from .models import Bookclass BookTestcase(TestCase):def setUp(self) -> None:# 添加书籍book_data_info = [{"title": "寻觅意义","author": "王德峰","state": 1,"published_date": "2022-10-01","price": 49.80,"publishers": "山东文艺出版社"},{"title": "国画","author": "王跃文","state": 1,"published_date": "2023-06-01","price": 69.80,"publishers": "湖南文艺出版社"},{"title": "鳄鱼","author": "莫言","state": 1,"published_date": "2023-06-01","price": 99.80,"publishers": "浙江文艺出版社"},{"title": "长安的荔枝","author": "马伯庸","state": 1,"published_date": "2022-10-01","price": 66.66,"publishers": "湖南文艺出版社"},]# 通过解包的方式传入for book_data in book_data_info:Book.objects.create(**book_data)def test_book_delete(self):# 删除Book.objects.filter(title="长安的荔枝").delete()# 查询count = Book.objects.filter(title="长安的荔枝").count()self.assertEqual(0, count)

相关文章:

Django开发之进阶篇

Django进阶篇 一、Django学习之模板二、Django学习之中间件默认中间件自定义中间件 三、Django学习之ORM定义模型类生成数据库表操作数据库添加查询修改删除 一、Django学习之模板 在 Django 中&#xff0c;模板&#xff08;Template&#xff09;是用于生成动态 HTML&#xff…...

【C++】:类和对象(3)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux的基础知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数…...

windows创建服务:更新服务信息乱码问题(ChangeServiceConfig)

因为小项目需要创建windows服务&#xff0c;安装微软官方示例一切都挺顺利&#xff0c;代码运行后发现配置的信息在系统里显示乱码。打开注册表发现的确是乱码。这就排除软件读取得问题&#xff0c;而是调用ChangeServiceConfig系统函数写入时就发生了乱码。让我在网上查找了一…...

Spark 9:Spark 新特性

Spark 3.0 新特性 Adaptive Query Execution 自适应查询(SparkSQL) 由于缺乏或者不准确的数据统计信息(元数据)和对成本的错误估算(执行计划调度)导致生成的初始执行计划不理想&#xff0c;在Spark3.x版本提供Adaptive Query Execution自适应查询技术&#xff0c;通过在”运行…...

Angular+html+js前端加载生命周期

参考&#xff1a;document.readyState - Web API 接口参考 | MDN (mozilla.org) 第一步&#xff0c;JS生命周期第一步 文档加载中状态&#xff0c;document.readyState loading 第二步&#xff0c;JS生命周期第二步 可交互状态&#xff0c;document.readyState interacti…...

社区投稿| 以安全视角,深度剖析 Sui Staking 与 LSD

本篇技术研报由 MoveBit 研究团队的 Jason 撰写 #1 Sui Staking 介绍 1.1 Sui 网络概述 Sui 网络由一组独立的验证者运行&#xff0c;每个验证者在自己的机器或集群上运行独立的 Sui 软件实例。 Sui 采用委托权益证明&#xff08;DPoS&#xff09;来确定哪些验证者参与网络…...

AM@邻域@极限定义中的符号说明

文章目录 abstract邻域&#x1f47a;邻域中心和半径去心邻域 ϵ , δ \epsilon,\delta ϵ,δ的意义各种极限定义的共同点几何意义极限定义中的极限过程临界值 ϵ \epsilon ϵ的选取&#x1f47a; 概念辨析&#x1f47a;无限接近不同于越来越接近例例 越来越接近推不出无限接近 …...

论Oracle兼容性,我们需要做什么

作者介绍&#xff1a;王海峰&#xff0c;数据库系统架构师&#xff0c;YashanDB SQL开发负责人&#xff0c;10年以上数据库内核技术开发经验。 Oracle兼容性是目前国产数据库的关键任务之一&#xff0c;其直接影响到商业迁移的成本和竞争力。 我们经常发现&#xff0c;部分国产…...

你知道多号发圈的同时并延迟评论的方式吗?

你知道多号发圈的同时并延迟评论的方式吗&#xff1f; 其实很简单。 步骤1&#xff1a;编辑好朋友圈内容 步骤2&#xff1a;设置延迟评论 步骤3&#xff1a;选择多个号发圈 通过以上3个步骤&#xff0c;就可以实现多号发圈的同时并延迟评论。 在发布朋友圈前&#xff0c;只需要…...

【BugBounty】记一次XSS绕过

前言 最近一直在看国外的赏金平台&#xff0c;绕waf是真的难受, 记录一下绕过的场景。 初步测试 一开始尝试XSS&#xff0c;发现用户的输入在title中展示&#xff0c;那么一般来说就是看能否闭合&#xff0c;我们从下面图中可以看到&#xff0c;输入尖括号后被转成了实体。 …...

Linux文件目录结构详解:根目录和常见子目录介绍

文章目录 引言1. 什么是Linux文件目录结构2. Linux文件系统的重要性 根目录&#xff08;/&#xff09;2.1 根目录的作用和特点2.2 根目录下常见目录的介绍 /bin 目录3.1 /bin 目录的作用和内容3.2 常见的可执行命令示例 /etc 目录4.1 /etc 目录的作用和内容4.2 配置文件的存放位…...

知识付费小程序的推广与用户增长策略

在知识付费小程序开发完成后&#xff0c;推广和用户增长是关键的成功因素。本文将探讨一些推广策略和用户增长方法&#xff0c;并提供代码示例&#xff0c;帮助您在知识付费小程序中实施这些策略。 1. 社交媒体分享功能 在知识付费小程序中添加社交媒体分享功能&#xff0c;…...

微信小程序 获取当前屏幕的可见高宽度

很多时候我们做一下逻辑 需要用整个窗口的高度或宽度参与计算 而且很多时候我们js中拿到的单位都是px像素点 没办法和rpx同流合污 官方提供了wx.getSystemInfoSync() 可以获取到部分窗口信息 其中就包括了整个窗口的宽度和高度 wx.getSystemInfoSync().windowHeight 返回值为像…...

使用 Splashtop 驾驭未来媒体和娱乐

在当今时代&#xff0c;数字转型不再是可选项&#xff0c;而是必选项。如今&#xff0c;媒体与娱乐业处于关键时刻&#xff0c;正在错综复杂的创意、技术和远程协作迷宫之中摸索前进。过去几年发生的全球事件影响了我们的日常生活&#xff0c;不可逆转地改变了行业的运作方式&a…...

Tomcat项目启动报错

java.io.IOException: java.lang.ClassCastException: Cannot cast org.springframework.web.SpringServletContainerInitializer to javax.servlet.ServletContainerInitializer解决办法&#xff1a;可能Tomcat版本不对&#xff0c;使用7.0.90版本启动报错&#xff0c;使用8.0…...

offer

【录用通知书】 如何判断公司的好坏呢。 注意了&#xff0c;我们软件行业&#xff0c;技术管理类&#xff0c;技术类&#xff0c;产品类 好公司好企业基本都会给你说清楚&#xff0c;一项多少钱&#xff0c;加班多少钱&#xff0c;这样的 像这类公司的薪资结构复杂就要特别…...

漏洞复现--鸿运主动安全监控云平台任意文件下载

免责声明&#xff1a; **文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何…...

第二章 物理层 | 计算机网络(谢希仁 第八版)

文章目录 第二章 物理层2.1 物理层的基本概念2.2 数据通信的基础知识2.2.1 数据通信系统的模型2.2.2 有关信道的几个基本概念2.2.3 信道的极限容量 2.3 物理层下面的传输媒体2.3.1 导引型传输媒体2.3.2 非导引型传输媒体 2.4 信道复用技术2.4.1 频分复用、时分复用和统计时分复…...

路由高级特性

项目拓扑与项目需求 项目需求 某企业网络使用ospf和isis作为IGP协议实现内部网络的互联互通&#xff0c;区域规划和IP规划如图所示&#xff0c;现在要求实现如下需求&#xff1a; LSW1和AR1使用vlan10互联&#xff0c;与AR2使用vlan20互联&#xff0c;LSW1与LSW2、3、4之间使…...

【MySQL】数据库排查慢查询、死锁进程排查、预防以及解决方法

MySQL数据库排查慢查询、死锁进程及解决方法 一、排查慢查询 1.1检查慢查询日志是否开启 1.1.1使用命令检查是否开启慢查询日志: SHOW VARIABLES LIKE slow_query_log;如果是 Value 为 off 则并未开启 1.1.2开启并且查看慢查询日志: MySQL提供了慢查询日志功能,可以记录所…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...

快速排序算法改进:随机快排-荷兰国旗划分详解

随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...