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

Python Web 开发及 Django 总结


title: Python Web 开发及 Django 总结
date: 2023-07-24 17:26:26
tags:

  • Python
  • Web
    categories:
  • Python
    cover: https://cover.png
    feature: false

Python 基础部分见:Python 基础总结

1. 创建项目

1.1 命令行

1、下载安装 Django

在终端输入 pip install django,下载 Django。在 Python 的安装目录下存在如下两个目录

  • Lib
    • 包含一些内置模块
    • 以及 site-packages 文件夹:用于存放一些第三方模块
  • Scripts
    • pip.exe、pip3.exe 等,可以用来安装一些第三方模块

下载完 Django 后,会在 Lib\site-packages 目录下生成 django 文件夹,包含了 Django 的源码;除此之外,还会在 scripts 目录下生成一个 django-admin.exe 文件,用于创建 Django 项目中的文件和文件夹

2、创建项目

用上面的 django-admin.exe 工具来创建 Django 项目,django-admin startproject 项目名称

1.2 Pycharm

选择创建 Django 项目

1.3 区别

  • 命令行:创建的项目是标准的
  • Pycharm:在标准的基础上增加了一些东西
    • templates 目录,根目录下的模板目录(可删除)
    • settings.py 中 'DIRS': [BASE_DIR / 'templates'],配置的是根目录下模板目录的路径,可将 DIRS 置为空 'DIRS': []

1.4 初始目录结构

  • 与项目名相同的包
    • __init__.py
    • asgi.py:接收网络请求,不需要动
    • settings.py:项目配置文件
    • urls.py:配置 URL 和 函数的对应关系
    • wsgi.py:接收网络请求,不需要动
  • templates:已删除
  • venv:虚拟环境
  • manage.py:用于项目的管理、启动项目、创建 app、数据管理等,不需要动

2. APP

一个 App 即一个独立的功能包,使用 manage.py 创建 app,python .\manage.py startapp app,初始目录结构如下

  • migrations:数据库变更记录,不需要动
    • __init__.py
  • templates:模板目录,后续可添加
  • static:静态文件目录,后续可添加
  • __init__.py
  • admin.py:Django 默认提供了 admin 后台管理,不需要动
  • apps.py:app 启动类,不需要动
  • models.py:对数据库进行操作
  • tests.py:单元测试,不需要动
  • views.py:与 URL 对应的函数

3. 基础使用

3.1 注册 App

添加 App 信息到 settings.py

# Application definitionINSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','app.apps.AppConfig'
]

3.2 编写 URL 和视图函数

urls.py 文件里添加 url 信息,先注释掉默认示例,参照默认示例自定义一个 url,然后导入 app 的 views.py 文件,因为 url 对应的函数写在 app 的 views.py 文件里

from django.contrib import admin
from django.urls import pathfrom app import viewsurlpatterns = [# path('admin/', admin.site.urls),path('index/', views.index),
]

views.py 文件里编写对应的函数

from django.http import HttpResponsedef index(request):return HttpResponse('欢迎使用')

3.3 启动项目

  • 命令行启动,python ./manage.py runserver
  • Pycharm 启动,直接点启动按钮即可

项目启动后,访问项目的默认地址,http://127.0.0.1:8000/,可以看到列出了项目的 url

加上 url 再访问,http://127.0.0.1:8000/index,可以看到我们在函数里返回的信息

4. 模板和静态文件

4.1 模板渲染

在 app 中创建 templates 文件夹,注意是在 app 里创建,而不是 1.3 的顶层 templates 文件夹,然后创建 index.html 文件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
欢迎
</body>
</html>

修改 views.py 文件的 index() 函数,将原本返回的 http 响应改为模板渲染,使用 render() 函数

from django.shortcuts import renderdef index(request):# return HttpResponse('欢迎使用')return render(request, 'index.html')

Pycharm 会自动更新修改,再访问 http://127.0.0.1:8000/index,显示的就是 index.html 文件的内容

这里的模板加载顺序为

  1. 优先去项目根目录的 templates 文件夹中寻找(即 1.3 的配置),不配置的话无效
  2. 第一点未配置的话,默认会根据 app 的注册顺序,依次在每个 app 下的 templates 目录中寻找

4.2 静态文件目录

默认的静态文件目录为 app 目录下的 static 目录,该项配置可在 settings.py 中修改,STATIC_URL = 'static/'

对应的静态文件相关目录结构为

  • static
    • CSS
    • img
    • js
    • plugins

对应的 HTML 文件中加载静态目录可以使用绝对路径,即写死文件的目录名,如 /static/img/1.jpg,缺点是假如修改了目录名或结构变化,对应的路径全都要修改;推荐使用相对路径(动态路径),如下

{% load static %}<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
欢迎
<img src="{% static 'img/1.jpg' %}">s
</body>
</html>

动态加载静态文件目录,这时会去读取 settings.py 文件配置的静态文件目录

4.3 模板语法

1、传参

修改 views.py 文件的视图函数,传入的参数格式为字典

from django.shortcuts import renderdef index(request):name = '张三'roles = ['管理员', '测试']user_info = {'name': '张三', 'age': 28}return render(request, 'index.html', {'n1': name, 'n2': roles, 'n3': user_info})

2、模板语法,由 Django 提供

  • render() 函数内部先会读取含有模板语法的 HTML 文件
  • 然后内部进行渲染,执行模板语法并替换数据,最终得到只包含 HTML 标签的字符串
  • 将渲染(替换)完成的字符串返回给用户浏览器
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<p> 直接取值 </p>
<ul><li> {{ n1 }} </li><li> {{ n2 }} </li>
</ul><p> 取列表值 </p>
<ul><li> {{ n2.0 }} </li><li> {{ n2.1 }} </li>
</ul><p> 循环展示 </p>
<ul>{% for item in n2 %}<li> {{ item }} </li>{% endfor %}
</ul><ul>{% for k, v in n3.items %}<li> {{ k }} = {{ v }} </li>{% endfor %}
</ul><p> 条件 </p>
{% if n1 == 'xxx'%}<h1> V1 </h1>
{% elif n1 == 'xx' %}<h1> V2 </h1>
{% else %}<h1> V3 </h1>
{% endif %}
</body>
</html>

页面展示为

5. 请求与响应

1、请求

views.py 文件中视图函数如下,request 为封装了用户发送过来的所有请求相关数据的对象

from django.http import HttpResponse
from django.shortcuts import redirectdef index(request):# 获取请求方式print(request.method)# 获取请求路径print(request.path)# 获取 URL 上传递的值print(request.GET)# 获取请求体中提交的数据print(request.POST)return redirect('https://www.baidu.com')

如浏览器请求:http://127.0.0.1:8000/index/?id=1

GET
/index/
<QueryDict: {‘id’: [‘1’]}>
<QueryDict: {}>

2、响应

响应分为三种

  • HttpResponse,直接返回响应数据
  • render,返回 HTML 页面
  • redirect,返回重定向地址

6. ORM

6.1 环境及配置

1、安装 mysqlclient,pip install mysqlclient

2、准备好对应的数据库环境,然后创建数据库,这里不多赘叙

3、Django 连接数据库,修改 settings.py 数据库配置,注释掉原有的数据库配置,添加新配置如下,可根据自己的数据库类型进行相应的改动

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'fan-web','USER': 'root','PASSWORD': 'password','HOST': '127.0.0.1','PORT': '3306'}
}

6.2 数据库表操作

6.2.1 创建表

修改 modles.py 文件,添加数据库表对应的实体类

from django.db import modelsclass Userinfo(models.Model):name = models.CharField(max_length=32)password = models.CharField(max_length=64)age = models.IntegerField()

依次执行如下命令,Django 会自动创建对应的数据库表,这里不需要加主键 ID,Django 会自动加

  • python .\manage.py makemigrations
  • python .\manage.py migrate

执行完成后,可以看到 Django 默认创建了一些表,而我们自定义的表也创建好了,并且自动加上了主键 ID

6.2.2 新增/删除表、删除表原有的字段

新增表直接在下面新加一个实体类即可,删除表则将对应的实体类删除,删除表原有的字段同样去掉实体类的字段即可

from django.db import models# class Userinfo(models.Model):
#     name = models.CharField(max_length=32)
#     password = models.CharField(max_length=64)
#     age = models.IntegerField()class Role(models.Model):name = models.CharField(max_length=32)code = models.CharField(max_length=64)

然后执行前面的两行命令

  • python .\manage.py makemigrations
  • python .\manage.py migrate

6.2.3 给表添加字段

同样的给实体类加上字段后,执行 python .\manage.py makemigrations 命令时,会要求进行选择,在命令行给字段赋默认值;还是先退出,修改实体类加上默认值后,再来执行命令

1、这里先选择直接在命令行赋值,选择 1,接下来会要求你输入赋的默认值

输入后,再执行 python .\manage.py migrate

到表里看,新增的字段已经都赋了默认值

2、直接在实体类中赋默认值,或者设置成允许为空

from django.db import modelsclass Userinfo(models.Model):name = models.CharField(max_length=32)password = models.CharField(max_length=64)age = models.IntegerField(default=2)data = models.IntegerField(null=True, blank=True)

6.2.4 修改表的字段

相当于先删除原有的字段,然后再新增一个字段,即同样需要赋默认值,操作与上同

6.3 数据库数据操作

6.3.1 添加数据

通过 modles.py 的实体类执行 create(key=value,...) 方法即可,Userinfo.objects.create(name='张三', password='123', age=18)

可以将其放到视图函数里,然后通过 url 来请求创建。在 views.py 文件里引入 modles.py,从而获取到实体类,执行其 create() 方法

from django.http import HttpResponsefrom app import modelsdef index(request):models.Userinfo.objects.create(name='张三', password='123', age=18)return HttpResponse('成功')

然后访问 http://127.0.0.1:8000/index/,则可看到数据库中添加了一条数据

6.3.2 获取数据

  • 获取全部数据:通过 modles.py 的实体类执行 all() 方法,models.Userinfo.objects.all(),获取到的数据是一个 QuerySet 类型
  • 条件获取:通过 modles.py 的实体类执行 filter() 方法,获取到的也是一个 QuerySet 类型
    • 不过通过主键 ID 来获取的话,主键 ID 是唯一的,这时肯定只有一行数据,可以加上 first() 方法来获取第一行数据,返回的是一个对象

其他的同上

from django.http import HttpResponsefrom app import modelsdef index(request):data_list = models.Userinfo.objects.all()print(data_list, type(data_list))for obj in data_list:print(obj.id, obj.name, obj.password, obj.age)filter_list = models.Userinfo.objects.filter(id=1)print(filter_list)obj = models.Userinfo.objects.filter(id=1).first()print(obj.id, obj.name, obj.password, obj.age)return HttpResponse('欢迎')

<QuerySet [<Userinfo: Userinfo object (1)>, <Userinfo: Userinfo object (2)>]> <class ‘django.db.models.query.QuerySet’>
1 张三 123 1
2 李四 123 1
<QuerySet [<Userinfo: Userinfo object (1)>]>
1 张三 123 1

6.3.3 删除数据

即在获取数据的基础上加上 delete() 方法

  • 条件删除:条件获取数据后再执行 delete() 方法,models.Userinfo.objects.filter(id=4).delete()
  • 全部删除:获取全部数据后再执行 delete() 方法,models.Userinfo.objects.all().delete()

其他的同上

from django.http import HttpResponsefrom app import modelsdef index(request):models.Userinfo.objects.filter(id=4).delete()# models.Userinfo.objects.all().delete()return HttpResponse('成功')

6.3.4 修改数据

在获取数据的基础上执行 update(key=value,...) 方法,与删除数据类似

from django.http import HttpResponsefrom app import modelsdef index(request):models.Userinfo.objects.filter(id=4).update(age=18)# models.Userinfo.objects.all().update(age=15)return HttpResponse('成功')

7. 前后端分离

前后端之间通常采用 JSON 格式来传递数据,可以利用 Django 封装的 JsonResponse 向浏览器返回 JSON 格式的数据

需要注意的是,JSON 格式也是一种 key:value 格式,所以返回为字典时,不会有问题,假如不是字典,要加上 参数 safe=False,否则会报 TypeError 异常

1、GET 请求

发送请求,http://localhost:8000/index?current=1&size=5

from django.http import JsonResponsedef index(request):print(request.GET)print(request.POST)# return JsonResponse({'message': '返回成功'})return JsonResponse('返回成功', safe=False)

<QueryDict: {‘current’: [‘1’], ‘size’: [‘5’]}>
<QueryDict: {}>

2、POST 请求

为了防止跨站请求伪造(CSRF),Django 全局发送 POST 请求均需要字符串验证,否则会报 Forbidden (CSRF cookie not set.)

解决方案如下

  • 注释 settings.py 文件中的 'django.middleware.csrf.CsrfViewMiddleware',
  • 在单个视图函数上加上 @csrf_exempt,需要引入 from django.views.decorators.csrf import csrf_exempt

发送请求,http://localhost:8000/index/,需要注意的是,POST 请求结尾要加上 /,并且 JSON 格式的数据会解析到 request.body 里,而非 request.POST

由于传递过来的数据为 bytes 类型数据,因此需要用 Python 提供的 json 库的 loads() 方法来加载数据,得到的是一个对象

from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json@csrf_exempt
def index(request):print(request.GET)print(request.POST)json_data = json.loads(request.body)print(json_data)print(json_data.get('data')[0].get('name'))# return JsonResponse('返回成功', safe=False)return JsonResponse({'message': '返回成功'})

<QueryDict: {}>
<QueryDict: {}>
{‘id’: ‘1100’, ‘data’: [{‘name’: ‘张三’, ‘age’: 19, ‘address’: ‘上海’, ‘gender’: ‘男’}]}
张三

相关文章:

Python Web 开发及 Django 总结

title: Python Web 开发及 Django 总结 date: 2023-07-24 17:26:26 tags: PythonWeb categories:Python cover: https://cover.png feature: false Python 基础部分见&#xff1a;Python 基础总结 1. 创建项目 1.1 命令行 1、下载安装 Django 在终端输入 pip install djan…...

《向量数据库指南》:向量数据库Pinecone故障排除

目录 无法pip安装 空闲后索引丢失 上传缓慢或延迟高 批处理带来的高查询延迟 使用gRPC客户端进行Upsert限流 Pods已满 安全问题 CORS错误 本节介绍常见问题以及如何解决它们。需要帮助吗?在我们的支持论坛中提问。标准、企业和专用客户还可以联系支持人员寻求帮助。...

[86] 分割链表

题目链接&#xff1a;86. 分隔链表 - 力扣&#xff08;LeetCode&#xff09; 第一种方法&#xff1a;类似双指针 自己想的&#xff0c;不知道读者是否能看懂&#xff0c;参考注释 ListNode* partition(ListNode* head, int x) {ListNode* bigpos nullptr;ListNode* littlep…...

【python】 清空socket缓冲区

在Python中使用Socket进行网络通信时&#xff0c;可以通过调用socket.recv()函数来接收数据&#xff0c;数据会被存储在缓冲区中。有时候&#xff0c;可能想要先清空缓冲区&#xff0c;以便后续的数据不会被之前的数据影响。以下是一种清空Python Socket缓冲区的方法&#xff1…...

108、RocketMQ的底层实现原理(不需要长篇大论)

RocketMQ的底层实现原理 RocketMQ由NameServer集群、Producer集群、Consumer集群、Broker集群组成&#xff0c;消息生产和消费的大致原理如下: Broker在启动的时候向所有的NameServer注册&#xff0c;并保持长连接&#xff0c;每30s发送一次心跳Producer在发送消息的时候从Na…...

怎么把PDF转为word?1分钟解决难题

PDF文件在我们的电脑上应用非常广泛&#xff0c;由于其较高的安全性和兼容性&#xff0c;得到了广泛的认可。然而&#xff0c;对于一些人来说&#xff0c;PDF文件不能直接进行编辑和修改可能是一个问题。因此&#xff0c;通常我们需要将其转换为Word格式&#xff0c;以便在Word…...

Mysql权限-系统表user,db,talbes_priv,columns_priv详解

一、MySQL 权限场景 可以根据登录用户限制用户访问资源(库、表)可以根据登录用户限制用户的操作权限(能对哪些库、表执行增删改查操作)可以指定用户登录IP或者域名可以限制用户权限分配 二、Mysql五个层级权限级别分析 Mysql权限级别分为了五个层级&#xff0c;并且每个级别…...

GPT-4 模型详细教程

GPT-4&#xff08;Generative Pretrained Transformer 4&#xff09;是 OpenAI 的最新语言生成模型&#xff0c;其在各类文本生成任务中表现优秀&#xff0c;深受开发者和研究者喜爱。这篇教程将帮助你理解 GPT-4 的基本概念&#xff0c;并向你展示如何使用它来生成文本。 什么…...

智慧环保:创造绿色未来

随着全球环境问题的日益严重&#xff0c;智慧环保成为推动绿色发展的关键。智慧环保利用先进的技术手段和智能化设备&#xff0c;致力于解决环境问题&#xff0c;保护生态环境&#xff0c;实现可持续发展。它融合了物联网、人工智能、大数据等技术&#xff0c;将科技的力量与环…...

虚拟 DOM和render()函数和Vue.js模板语法

[TOC](虚拟 DOM和render()函数) 1. 虚拟DOM 虚拟DOM是Vue中非常重要的概念&#xff0c;它是一个虚拟的内存中的数据结构&#xff0c;用来表示真实的DOM树。Vue使用虚拟DOM来减少对真实DOM的操作次数&#xff0c;从而提高页面的性能。 虚拟DOM的工作原理如下&#xff1a; Vu…...

k8s Service网络详解(一)

k8s Service网络详解&#xff08;一&#xff09; 有关K8s网络的几个概念K8s网络模型k8s网络插件ServiceService的访问方式Service的种类无头服务&#xff08;Headless Services&#xff09;带选择算符的服务无选择算符的服务 Service的类型ClusterIPNodeportLoadBalancerExtern…...

抖音账号矩阵系统开发源码

一、技术自研框架开发背景&#xff1a; 抖音账号矩阵系统是一种基于数据分析和管理的全新平台&#xff0c;能够帮助用户更好地管理、扩展和营销抖音账号。 部分源码分享&#xff1a; ic function indexAction() { //面包屑 $breadcrumbs [ [tit…...

Python+Texturepacker自动化处理图片

前言 本篇在讲什么 PythonTexturepacker自动化处理图片 本篇需要什么 对Python语法有简单认知 依赖Python2.7环境 依赖Texturepacker工具 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &…...

K8s Service网络详解(二)

K8s Service网络详解&#xff08;二&#xff09; Kube Proxy调度模式Kube-proxy IptablesKube-proxy IPVS Service SelectorPod DNS种常见的 DNS 服务Kube-DNSCoreDNSCorefile 配置 DNS 记录DNS 记录 ServiceDNS 记录 PodDNS 配置策略 Pod 的主机名设置优先级 Ingress Kube Pro…...

Rust vs Go:常用语法对比

这个网站 可以列出某门编程语言的常用语法&#xff0c;也可以对比两种语言的基本语法差别。 在此对比Go和Rust 1. Print Hello World 打印Hello World package mainimport "fmt"func main() { fmt.Println("Hello World")} fn main() { println!("…...

Vlan端口隔离(第二十四课)

一、端口隔离 1、端口隔离技术概述 1)端口隔离技术出现背景:为了实现报文之间的二层隔离,可以将不同的端口加入不同的VLAN,但这样会浪费有限的VLAN ID资源。 2)端口隔离的作用:采用端口隔离功能,可以实现同一VLAN内端口之间的隔离。 3)如何实现端口隔离功能:只需要…...

js实现框选截屏功能

实现的思路大概就是&#xff0c;先将dom转化为canvas画布&#xff0c;再对canvas进行裁切&#xff0c;然后通过canvas api生成图片&#xff0c;这里用到了一个库html2canvas 效果如图&#xff1a; 首先实现框选效果&#xff1a; const mousedownEvent (e) > {moveX 0;mo…...

Manjaro Linux 连接公司的 VPN 网络

注意&#xff1a;如果你公司的 VPN 网络是在苹果下使用的&#xff0c;本文可能不适用&#xff08;苹果系统不支持 PPTP&#xff09;。 用 Linux 和用 Windows/macOS 不一样&#xff0c;它真的需要用户操心很多东西。比如怎么连接公司的 VPN 网络…… 我是折腾了挺久&#xff0…...

Ama no Jaku

登录—专业IT笔试面试备考平台_牛客网 题目大意&#xff1a;有一个n*n且仅由0和1构成的矩阵&#xff0c;每次操作可以将一整行或一整列的所有数取反&#xff0c;问能否使所有行中构成的最小数>所有列中构成的最大数 1<n<2000 思路&#xff1a;首先&#xff0c;如果…...

视频基础知识

1.视频比特率 视频的比特率是指传输过程中单位时间传输的数据量。可以理解为视频的编码采样率。单位是kbps&#xff0c;即每秒千比特。视频比特率是决定视频清晰度的一个重要指标。比特率越高&#xff0c;视频越清晰&#xff0c;但数据量也会越大。比如一部100分钟的电影&#…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...