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

高效 Python Web 开发:FastAPI 入门与实践

高效 Python Web 开发:FastAPI 入门与实践

目录

  • 1. 安装与环境配置
    • 📦 安装 FastAPI 和 Uvicorn
    • 🗂️ 项目目录结构和初始化
    • 🚀 创建一个简单的 FastAPI 项目
  • 🛠️ 2. FastAPI 路由与请求处理
    • 🛣️ 基本路由设置
    • 🌍 路由参数与类型注解
    • 📝 请求体的接收与验证
  • 🔒 3. 数据库集成与操作
    • 🗃️ 使用 SQLAlchemy 连接数据库
    • 💾 CRUD 操作实现
    • 🛡️ 数据验证与安全性处理
  • 📈 4. FastAPI 性能优化
    • ⚡ 异步编程与性能提升
    • 🔍 日志记录与调试技巧
    • 🛠️ 性能瓶颈分析与解决

✨ 1. 安装与环境配置

📦 安装 FastAPI 和 Uvicorn

在进行 FastAPI 开发之前,首先需要安装两个核心组件:FastAPI 和 Uvicorn。

  • FastAPI:作为 Web 框架,FastAPI 提供了高效且易用的接口,允许开发者轻松构建 Web 应用和 API。
  • Uvicorn:作为 ASGI 服务器,Uvicorn 运行 FastAPI 应用并处理 HTTP 请求。它支持异步 I/O,可以提供高并发和低延迟的性能。

在你的终端中输入以下命令安装这两个依赖项:

pip install fastapi uvicorn

FastAPI 与传统的 WSGI 服务器(如 Gunicorn)不同,它基于 ASGI(Asynchronous Server Gateway Interface)。ASGI 支持异步处理,能够有效地处理高并发请求,特别是在处理 I/O 密集型任务(如数据库操作、API 调用等)时非常有优势。

🗂️ 项目目录结构和初始化

在安装完成后,接下来需要设置项目的目录结构。为了保证项目的可维护性和扩展性,通常会将文件按功能模块划分成多个子目录。在这里,我们创建一个基本的 FastAPI 项目目录结构:

my_fastapi_project/
│
├── app/
│   ├── __init__.py
│   ├── main.py
│   └── models.py
│
└── requirements.txt
  • app/ 目录:包含 FastAPI 项目的核心文件。
    • main.py:应用的入口文件,包含 FastAPI 实例化和路由定义。
    • models.py:包含数据库模型(如果使用数据库)和相关逻辑。
  • requirements.txt:列出所有项目依赖库,方便其他开发者或服务器部署时安装依赖。

🚀 创建一个简单的 FastAPI 项目

main.py 中,我们将创建一个最基本的 FastAPI 应用实例,并定义一个简单的路由。此时,FastAPI 只会返回一个简单的 JSON 响应。

# app/main.py
from fastapi import FastAPI# 创建 FastAPI 应用实例
app = FastAPI()# 定义根路由,返回一个简单的 JSON 响应
@app.get("/")
def read_root():return {"message": "Hello, FastAPI!"}

在上述代码中,我们首先导入 FastAPI 类,然后通过 FastAPI() 创建一个应用实例。@app.get("/") 是 FastAPI 提供的装饰器,表示该函数会响应 HTTP GET 请求。read_root 函数返回一个 JSON 格式的响应,其中包含了简单的欢迎信息。

启动应用前,首先需要在终端运行以下命令,启动 Uvicorn 服务器:

uvicorn app.main:app --reload
  • app.main:app 指定了 FastAPI 应用的位置:app.main 表示从 main.py 文件中加载应用实例,app 是 FastAPI 应用实例的名称。
  • --reload 参数启用自动重载,当代码变动时,服务器会自动重新启动,便于开发阶段的调试。

此时,可以在浏览器中访问 http://127.0.0.1:8000/,你会看到如下 JSON 响应:

{"message": "Hello, FastAPI!"}

此外,FastAPI 自动为你的 API 提供交互式文档。你可以访问 http://127.0.0.1:8000/docs,通过 Swagger UI 进行 API 测试和查看路由详情。这使得开发者可以快速测试 API,同时还可以为前端开发者提供接口文档。

小结

至此,我们已经完成了 FastAPI 项目的基础搭建,并成功启动了一个简单的应用。通过上述步骤,你不仅安装了 FastAPI 和 Uvicorn,还创建了第一个 FastAPI 路由并运行了项目。下一步,将深入探讨 FastAPI 的路由和请求处理功能,进一步拓展功能。


🛠️ 2. FastAPI 路由与请求处理

🛣️ 基本路由设置

在 FastAPI 中,路由是定义在 FastAPI 应用实例上的函数。每个路由对应一个 HTTP 请求方法(如 GETPOSTPUTDELETE 等)。通过装饰器来定义路由和请求处理函数,FastAPI 会根据不同的 URL 路径和 HTTP 方法自动匹配对应的函数。

例如,我们可以为应用添加多个路由,每个路由处理不同的请求:

# app/main.py
from fastapi import FastAPIapp = FastAPI()@app.get("/")
def read_root():return {"message": "Welcome to FastAPI!"}@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):return {"item_id": item_id, "q": q}@app.post("/items/")
def create_item(item: dict):return {"message": "Item created", "item": item}
路由解析
  • @app.get("/"):定义根路由,处理 GET 请求。
  • @app.get("/items/{item_id}"):带路径参数的路由,用于获取指定 item_id 的项。
  • @app.post("/items/"):定义一个 POST 请求,用于创建新项。

🌍 路由参数与类型注解

FastAPI 支持使用路径参数和查询参数。路径参数用于动态匹配 URL 中的部分内容,而查询参数则是 URL 中以 ? 开始的键值对。

在定义路由时,可以直接在函数签名中指定路径参数的名称和类型,FastAPI 会自动解析并验证这些参数的类型。例如,item_id: int 表示 item_id 是一个整数。FastAPI 会确保传入的参数是有效的整数,否则会返回 422 错误。

# app/main.py
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):return {"item_id": item_id, "q": q}

当请求 /items/42?q=example 时,item_id 会被解析为 42,而 q 会被解析为 example。如果 q 参数没有提供,默认值为 None

📝 请求体的接收与验证

在 FastAPI 中,除了路径参数和查询参数外,我们还可以通过请求体接收数据,通常用于 POSTPUT 等方法。FastAPI 支持接收 JSON 格式的数据,并自动将其转换为 Python 字典。

例如,接收一个 JSON 请求体,并返回处理结果:

# app/main.py
from pydantic import BaseModelclass Item(BaseModel):name: strdescription: str = Noneprice: floattax: float = None@app.post("/items/")
def create_item(item: Item):return {"message": "Item created", "item": item}

这里,我们使用了 Pydantic 模型(Item)来验证请求体的结构和字段类型。BaseModel 类是 Pydantic 的基类,用于创建数据模型。通过这种方式,FastAPI 会自动验证请求体是否符合定义的结构,如果验证失败,它会自动返回错误响应。

请求示例
{"name": "Sample Item","description": "A sample item for testing","price": 10.5,"tax": 1.5
}

FastAPI 会自动将此 JSON 请求体转换为 Item 实例,并将其传递给 create_item 函数。

小结

FastAPI 路由和请求处理非常灵活,可以轻松处理路径参数、查询参数和请求体的验证和解析。通过 Pydantic 模型,

开发者可以确保传入的数据符合预期结构,减少了很多手动验证的工作。


🔒 3. 数据库集成与操作

🗃️ 使用 SQLAlchemy 连接数据库

在很多应用中,数据库是不可或缺的部分。FastAPI 支持多种数据库驱动,并且与 SQLAlchemy 配合使用非常方便。SQLAlchemy 是一个强大的 Python ORM,可以帮助开发者方便地操作关系型数据库。

首先,安装必要的依赖:

pip install sqlalchemy databases

接下来,设置数据库连接。在本例中,我们将使用 SQLite 作为数据库。

# app/models.py
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmakerDATABASE_URL = "sqlite:///./test.db"# 创建数据库引擎
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})# 创建 SQLAlchemy 会话
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)# 创建基类
Base = declarative_base()

在上面的代码中,DATABASE_URL 是数据库的连接地址。我们使用 create_engine 来创建数据库引擎,sessionmaker 用于创建数据库会话。

💾 CRUD 操作实现

在 FastAPI 中,处理数据库操作时通常会使用 CRUD(Create、Read、Update、Delete)模式。我们可以定义数据库模型,并使用 SQLAlchemy 执行数据库操作。

# app/models.py
class Item(Base):__tablename__ = "items"id = Column(Integer, primary_key=True, index=True)name = Column(String, index=True)description = Column(String, index=True)# 创建数据库表
Base.metadata.create_all(bind=engine)

定义了 Item 数据模型后,可以通过 FastAPI 路由进行 CRUD 操作。例如,创建一个新的项并存储到数据库中:

# app/main.py
from sqlalchemy.orm import Session
from fastapi import Depends, FastAPIfrom .models import Item, SessionLocalapp = FastAPI()# 创建依赖项:获取数据库会话
def get_db():db = SessionLocal()try:yield dbfinally:db.close()@app.post("/items/")
def create_item(item: Item, db: Session = Depends(get_db)):db.add(item)db.commit()db.refresh(item)return item

小结

使用 SQLAlchemy 和 FastAPI 结合,可以轻松地进行数据库操作。通过定义数据模型和数据库会话,开发者可以实现高效的 CRUD 操作,并保证数据的完整性和一致性。


📈 4. FastAPI 性能优化

⚡ 异步编程与性能提升

FastAPI 本身是异步框架,支持通过 async def 定义异步路由。通过异步编程,FastAPI 可以在处理 I/O 密集型任务时显著提升性能,特别是在高并发情况下。

@app.get("/items/{item_id}")
async def read_item(item_id: int):item = await get_item_from_db(item_id)return item

使用异步编程时,注意数据库查询、API 请求等操作需要是异步的。对于同步代码,FastAPI 也支持自动转换,但异步编程能充分发挥其性能优势。

🔍 日志记录与调试技巧

日志记录是开发过程中不可或缺的一部分。在 FastAPI 中,可以通过标准的 Python logging 模块来实现。

import logginglogging.basicConfig(level=logging.INFO)@app.get("/")
async def root():logging.info("Root endpoint accessed")return {"message": "Hello, FastAPI!"}

通过设置日志级别为 INFO,你可以记录重要的事件,如请求到达、数据库操作等。

🛠️ 性能瓶颈分析与解决

在开发过程中,性能瓶颈是不可避免的。使用 FastAPI 时,可以通过 Profiling(性能分析)工具来检测性能瓶颈,并进行优化。常见的优化方法包括优化数据库查询、缓存热点数据和使用更高效的算法。

通过利用异步编程、数据库优化和缓存机制,可以进一步提升 FastAPI 应用的性能。


相关文章:

高效 Python Web 开发:FastAPI 入门与实践

高效 Python Web 开发:FastAPI 入门与实践 目录 ✨ 1. 安装与环境配置 📦 安装 FastAPI 和 Uvicorn🗂️ 项目目录结构和初始化🚀 创建一个简单的 FastAPI 项目 🛠️ 2. FastAPI 路由与请求处理 🛣️ 基本…...

C++中的函数重载

函数重载是指在同一个作用域(通常是一个类或者一个命名空间)内,可以有多个同名函数,但是这些同名函数的参数列表(参数的个数、类型或者顺序)不同。当调用这个函数名时,编译器会根据传入的实际参…...

达梦数据库常用指令都是工作中常用的

达梦数据库连接配置文件名称 cd /etc/dm_svc.conf查询 sql 日志记录是否开启:0 关闭,1/2/3开启); select SF_GET_PARA_VALUE(1,SVR_LOG)union ALL select SF_GET_PARA_VALUE(2,SVR_LOG);关闭 sql 日志记录功能 call SP_SET_PARA_VALUE(1,SVR_LOG,0);开…...

【2024最新】基于Springboot+Vue的就业信息管理系统Lw+PPT

作者:计算机搬砖家 开发技术:SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:Java精选实战项…...

linux一键部署apache脚本

分享一下自己制作的一键部署apache脚本: 脚本已和当前文章绑定,请移步下载(免费!免费!免费!) (单纯的分享!) 步骤: 将文件/内容上传到终端中 …...

修改MySQL数据库密码报1290

修改MySQL数据库密码报1290 错误 如下: alter user ‘root’‘localhost’ identified by ‘root’; ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement 需要刷新下配置 flush privileg…...

OpenCV4.8 开发实战系列专栏之 17 - 图像直方图

大家好,欢迎大家学习OpenCV4.8 开发实战专栏,长期更新,不断分享源码。 专栏代码全部基于C 与Python双语演示,领学习资料(Free) & 进专栏答疑群, VX: OpenCVXueTang_Asst 本文关键知识点:图…...

Linux下如何安装JDK

在Linux系统上安装JDK(Java Development Kit),通常包括下面步骤: 下载JDK安装包解压安装包配置环境变量等 在介绍安装之前,先厘清一些常用问题。 Linux 下Java 安装到哪个目录比较好? 在Linux系统下&am…...

实时数据开发|Flink如何实现不同数据源输入--DataSource模块

DataStream 编程模型 Flink定义DataStream API让用户灵活且高效的编写流式应用。主要分为3部分:DataSource模块,Transformation模块以及DataSink模块。 DataSource模块,主要定义了数据接入功能,将外部数据接入至flink&#xff0…...

使用Dify与BGE-M3搭建RAG(检索增强生成)应用-改进一,使用工作流代替Agnet

文章目录 前言Agent vs 工作流编写工作流 前言 在上一篇中,我们实现了一个基本的基于Dify的RAG的示范。 使用Dify与BGE-M3搭建RAG(检索增强生成)应用 这个效果确实很差。 我们一起来看看,该怎么改进。 今天我们就尝试一下&…...

GPT模型:改变世界的AI魔法师

目录 一、什么是GPT?它是怎么来的? 二、GPT能干啥?(它简直无所不能!) 三、想用GPT?这点开发技巧你一定要知道! 第一步:用OpenAI API搭建自己的GPT服务 第二步&#x…...

初识ProtoBuf以及环境搭建(Win和Ubuntu)

初始ProtoBuf 序列化和反序列化的概念 序列化:把对象转换为字节序列的过程 称为对象的序列化。 反序列化:把字节序列恢复为对象的过程 称为对象的反序列化。 什么情况下需要序列化和反序列化? 存储数据:当你想把的内存中的对象状…...

H3C OSPF实验

实验拓扑 实验需求 按照图示配置 IP 地址按照图示分区域配置 OSPF ,实现全网互通为了路由结构稳定,要求路由器使用环回口作为 Router-id,ABR 的环回口宣告进骨干区域 实验解法 一、配置IP地址 [R1]int l0 [R1-LoopBack0]ip add 1.1.1.1 32 […...

【Spark源码分析】基于Spark3.4.2源码分析SparkSQL执行过程

基于Spark3.4.2源码分析SparkSQL执行过程 文章目录 基于Spark3.4.2源码分析SparkSQL执行过程基本执行流程Unresolved逻辑计划树相关类RuleExector相关类 详细代码SparkSessionAbstractSqlParserDatasetQueryExecutionAnalyzerRuleExecutorCheckAnalysis 附录CTE简述SQL解析器Qu…...

centos8:Could not resolve host: mirrorlist.centos.org

【1】错误消息: [rootcentos211 redis-7.0.15]# yum update CentOS Stream 8 - AppStream …...

超详细ensp配置VRRP和MSTP协议

一、简介 1、什么是VRRP: (1)VRRP(Virtual Router Redundancy Protocol)的概念: VRRP(Virtual Router Redundancy Protocol)指的是一种实现路由器冗余备份的协议,常用于…...

聊聊Flink:这次把Flink的触发器(Trigger)、移除器(Evictor)讲透

一、触发器(Trigger) Trigger 决定了一个窗口(由 window assigner 定义)何时可以被 window function 处理。 每个 WindowAssigner 都有一个默认的 Trigger。 如果默认 trigger 无法满足你的需要,你可以在 trigger(…) 调用中指定自定义的 tr…...

为啥不推荐使用数据库外键

为啥不推荐使用数据库外键 前言 在阿里开发手册中写道:不得使用外键与级联,一切外键概念必须在应用层解决。 说明:(概念解释)学生表中的 student_id 是主键,那么成绩表中的 student_id 则为外键。如果更…...

C# 13 中的新增功能

C# 12 中的新增功能C# 11 中的新增功能C# 10 中的新增功能C# 9.0 中的新增功能C# 8.0 中的新增功能C#7.0中有哪些新特性?C#6.0中10大新特性的应用和总结C# 5.0五大新特性 将C#语言版本升级为预览版 C# 13 包括一些新增功能。 可以使用最新的 Visual Stu…...

sunshine+moonlight

参考自 b站视频 电脑端(发送端) 去 sunshine github 下载 https://github.com/LizardByte/Sunshine/releases/tag/v2024.1127.551下载后打开,创建用户名和密码修改配置选项,启用 UPnP,IP 地址族使用 IPv4IPv6 平板端…...

Python练习题合集

目录 一. 请编程输出其中 “超过平均身高” 的那些值。 二. 字典处理: 三. 求斐波那契数列的前若干项 四. 编程输出最长字符串的长度。 五. 去掉一个最高分,去掉一个最低分,其余分求平均作为最终分数。 六. 打印小九九乘法表 七.…...

frp 内网穿透

文章目录 前言使用自己的服务器搭建frp 这里服务器是linux centos 7 宝塔,client是 windows10 https://github.com/fatedier/frp/releases/tag/v0.53.2 版本下载分客户端与服务端 一、frp是什么?二、使用步骤1.部署服务器端2.客户端 前言 使用自己的服务…...

Vue3 子路由vue如何调用父路由vue中的方法?

1. router -> index.ts 文件: import { createRouter, createWebHistory } from vue-router import DefaultView from /views/default/index.vue import ParentView from /views/parent/index.vue import ChildView from /views/child/index.vueconst router …...

Docker 清理镜像策略详解

文章目录 前言一、删除 Docker 镜像1. 查看当前镜像2. 删除单个镜像3. 删除多个镜像4. 删除所有未使用的镜像5. 删除悬空的 Docker 镜像6. 根据模式删除镜像7. 删除所有镜像 二、删除 Docker 容器1. 查找容器2. 删除一个或多个特定容器3. 退出时删除容器4. 删除所有已退出的容器…...

Qt自定义 Qt Designer 插件

创建 Qt Designer 插件项目 Qt 提供两种设计插件的 API,可以用于扩展 Qt 的功能。高级 API 用于设计插件以扩展 Qt 的功能,例如定制数据库驱动、图像格式、文本编码、定制样式等。Qt Designer 里大量采用了插件,点击 Qt Creator 的“Help”-…...

【C语言】扫雷游戏(一)

我们先设计一个简单的9*9棋盘并有10个雷的扫雷游戏。 1,可以用数组存放,如果有雷就用1表示,没雷就用0表示。 2,排查(2,5)这个坐标时,我们访问周围的⼀圈8个位置黄色统计周围雷的个数是1。排查(8,6)这个坐标时&#xf…...

ESP32-S3模组上跑通ES8388(12)

接前一篇文章:ESP32-S3模组上跑通ES8388(11) 二、利用ESP-ADF操作ES8388 2. 详细解析 上一回解析了es8388_init函数中的第5段代码,本回继续往下解析。为了便于理解和回顾,再次贴出es8388_init函数源码,在…...

数据集-目标检测系列- 海边漫步锻炼人检测数据集 person >> DataBall

数据集-目标检测系列- 海边漫步锻炼人检测数据集 person >> DataBall DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球…...

【论文笔记】A Token-level Contrastive Framework for Sign Language Translation

🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: A Token-level Contrastiv…...

多线程篇-9--锁的使用及分类(可重入锁,读写锁,锁降级,死锁,LockSupport,乐观锁,悲观锁,分段锁等)

1、锁的概述 Java 中,锁是一种用于控制多线程并发访问共享资源的机制。合理的锁机制可以确保线程安全,避免数据竞争和不一致的问题。 Java 提供了多种锁机制,包括内置锁(即 synchronized 关键字)、显式锁(…...

提升阅读体验,Balabolka让文字跃然“声”上

作为一个专业的语音合成工具,Balabolka为用户提供了全方位的文本朗读解决方案。这款软件不仅可以将各类文本实时转换为清晰的语音输出,还能将转换后的音频内容导出为多种主流格式。它强大的兼容性使其能够处理各类电子书和文档格式,让用户可以…...

【汇编语言】call 和 ret 指令(三) —— 深度解析汇编语言中的批量数据传递与寄存器冲突

文章目录 前言1. 批量数据的传递1.1 存在的问题1.2 如何解决这个问题1.3 示例演示1.3.1 问题说明1.3.2 程序实现 2. 寄存器冲突问题的引入2.1 问题引入2.2 分析与解决问题2.2.1 字符串定义方式2.2.2 分析子程序功能2.2.3 得到子程序代码 2.3 子程序的应用2.3.1 示例12.3.2 示例…...

嵌入式C编程:宏定义与typedef的深入对比与应用

目录 一、宏定义(Macro Definition) 1.1. 特点与应用 1.1.1 定义常量 1.1.2 定义函数式宏 1.1.3 条件编译 1.2. 作用范围和生命周期方面 1.3. 应用注意事项 二、typedef 2.1. 特点与应用 2.1.1 简化类型声明 2.1.2 提高代码可读性 2.1.3 实现…...

算法复杂度

目录: 算法的效率时间复杂度 1.算法的效率 1.1旋转数组习题分析 如何衡量一个算法的好坏呢? 案例:旋转数组(189. 轮转数组 - 力扣(LeetCode)) 思路:循环k次将所有元素向后移动一…...

时序约束进阶六:Set_Clock_Groups详解

目录 一、前言 二、时钟间关系 2.1 时钟关系分类 2.2 时钟关系查看 三、set_clock_groups设置 3.1 使用格式 3.2 优先级 3.3 约束设置示例 3.4 约束效果查看 四、Exclusive差异说明 4.1 Asynchronous 4.2 Logically_exclusive与Physically_exclusive 4.3 logical…...

《运放秘籍》第二部:仪表放大器专项知识点总结

一、差分放大器与仪表放大器的讨论 1.1. 仪放的前世今生——差分放大器原理? 1.2. 差分放大的原理 1.3. 差分放大器检测电流 1.4. 差分放大器端一:输入阻抗 1.5. 差分放大器端二:共模抑制比 1.6. 为什么关注输入阻抗?共模抑…...

JavaSE——异常

一、异常的概念 在Java中,将程序执行中发生的不正常行为称为"异常",开发过程中的语法错误和逻辑错误不是异常。 主要分为以下两大类: Error(错误):Java虚拟机无法解决的严重问题,是严重错误,程序…...

HormonyOS: 图形变换之Rotate

官网地址:rotate 1. 概述 rotate是鸿蒙系统为组件提供的旋转属性,通过rotate属性,可实现组件的旋转效果 2. rotate属性 2.1. 语法参数 rotate(value: RotateOptions) 参数: 参数名 类型 必填 说明 value RotateOptions…...

【Solidity】入门指南:智能合约开发基础

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 Solidity入门指南:智能合约开发基础引言1. 开发环境搭建1.1 Remix I…...

HTMLHTML5革命:构建现代网页的终极指南 - 3. 开发工具选择

HTML&HTML5革命:构建现代网页的终极指南 3. 开发工具选择 大家好,我是莫离老师。 前两节课我们学习了 HTML 的基础概念和 HTML5 的主要特性,为接下来的实际开发奠定了理论基础。 今天,我们将讨论开发工具的选择问题。 选择合…...

智能设备安全隐患:五项关键解决措施

目前,我们的智能设备越来越多,而背后的物联网(IoT)安全像一面隐形的盾牌,默默地守护着我们周围那些复杂连网的设备。 为了让大家更加明白这些安全协议和操作是如何高效运作的,我们有必要深入探讨物联网安全…...

Android NDK开发 JNI 基础

在android 系统开发中 ndk开发是很重要的内容。ndk开发中 jni 是基础。 目录 一.什么是JNI 二. 如何使用JNI 1.Java 代码如何调用 c/c 代码 2. c/c如何调用 java 函数 一.什么是JNI JNI——Java Native Interface,它是Java平台的一个特…...

嵌入式linux之文件系统管理

嵌入式Linux文件系统的管理涉及多个方面,包括文件系统的创建、配置、维护以及优化。以下是一些关键点和实践技巧: 文件系统的创建与配置 选择合适的文件系统:根据应用需求(如读写频率、存储介质类型等)选择最合适的文…...

Y20030029 微信+SPRINGBOOT+MYSQL+LW+传统文化展示小程序的设计与实现 源代码 配置 文档

传统文化展示小程序 1.项目描述2. 课题开发的背景与意义3.项目功能4.界面展示5.源码获取 1.项目描述 基于微信小程序的传统文化展示小程序是一个集合了多种传统文化元素与现代化技术的创新平台。它充分利用了微信小程序的便捷性和普及性,为广大用户提供了一个深入了…...

【LC】3232. 判断是否可以赢得数字游戏

题目描述: 给你一个 正整数 数组 nums。 Alice 和 Bob 正在玩游戏。在游戏中,Alice 可以从 nums 中选择所有个位数 或 所有两位数,剩余的数字归 Bob 所有。如果 Alice 所选数字之和 严格大于 Bob 的数字之和,则 Alice 获胜。如果…...

【人工智能基础03】机器学习(练习题)

文章目录 课本习题监督学习的例子过拟合和欠拟合常见损失函数,判断一个损失函数的好坏无监督分类:kmeans无监督分类,Kmeans 三分类问题变换距离函数选择不同的起始点 重点回顾1. 监督学习、半监督学习和无监督学习的定义2. 判断学习场景3. 监…...

C/C++每日一练:合并K个有序链表

本篇博客将探讨如何 “合并K个有序链表” 这一经典问题。本文将从题目要求、解题思路、过程解析和相关知识点逐步展开,同时提供详细注释的代码示例。 链表(Linked List) 链表是一种线性数据结构,由一系列节点(Node&…...

jmeter基础07_组件的层级

课程大纲 1. 优先级/执行顺序(一般情况) 同级组件:按组件先后顺序执行。如:同一层的线程组、同一层的http请求。 上下级组件:先执行外层(上级),再执行内层(下级&#xff…...

【QNX+Android虚拟化方案】125 - 如何创建android-spare镜像

【QNX+Android虚拟化方案】125 - 如何创建android-spare镜像 1. Android侧创建 (ext4 / sparse) test_img.img 镜像 方法一2. Android侧创建 (ext4 / sparse) test_img.img 镜像 方法二3. qnx 侧 分区透传Android 配置3.1 配置分区透传3.2 Android 侧分区 rename3.3 创建挂载目…...

大R玩家流失预测在休闲社交游戏中的应用

摘要 预测玩家何时会离开游戏为延长玩家生命周期和增加收入贡献创造了独特的机会。玩家可以被激励留下来,战略性地与公司组合中的其他游戏交叉链接,或者作为最后的手段,通过游戏内广告传递给其他公司。本文重点预测休闲社交游戏中高价值玩家…...