fastapi学习

fastapi框架

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mLnT3F4K-1689471141826)(assets/%E6%88%AA%E5%B1%8F2022-08-29%2016.31.21.png)]

fastapi,一个用于构建 API 的现代、快速(高性能)的web框架。

fastapi是建立在Starlette和Pydantic基础上的,Pydantic是一个基于Python类型提示来定义数据验证、序列化和文档的库。Starlette是一种轻量级的ASGI框架/工具包,是构建高性能Asyncio服务的理性选择。

  • 快速:可与 NodeJS 和 Go 比肩的极高性能(归功于 StarlettePydantic),是最快的 Python web 框架之一。
  • 高效编码:提高功能开发速度约 200% 至 300%。
  • 更少bug:减少约 40% 的人为(开发者)导致错误。
  • 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
  • 简单:设计的易于使用和学习,阅读文档的时间更短。
  • 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。
  • 健壮:生产可用级别的代码。还有自动生成的交互式文档

依赖:Python 3.6 及更高版本,FastAPI 站在以下巨人的肩膀之上

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vCc4wgdh-1689471141827)(assets/starlette.png)]

Starlette 负责 web 部分(Asyncio)

Pydantic 负责数据部分(类型提示)

FastApi是站在前人肩膀上,集成了多种框架的优点的新秀框架。它出现的比较晚,2018年底才发布在github上。广泛应用于当前各种前后端分离的项目开发,测试运维自动化以及微服务的场景中。

一、预备知识点

1.1、http协议
 
  
一、简介

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW:World Wide Web )服务器与本地浏览器之间传输超文本的传送协议。HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eOlHUxXV-1689471141827)(assets/%E6%88%AA%E5%B1%8F2022-08-28%2020.18.31.png)]

二、 http协议特性
 
  
三、http请求协议与响应协议

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YeQtObnw-1689471141827)(assets/image-20220901214542004.png)]

http协议包含由浏览器发送数据到服务器需要遵循的请求协议与服务器发送数据到浏览器需要遵循的请求协议。用于HTTP协议交互的信被为HTTP报文。请求端(客户端)的HTTP报文 做请求报文,响应端(服务器端)的 做响应报文。HTTP报文本身是由多行数据构成的字文本。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XdeG7EuB-1689471141828)(assets/http%E5%8D%8F%E8%AE%AE.png)]

一个完整的URL包括:协议、ip、端口、路径、参数

例如: https://www.baidu.com/s?wd=yuan 其中https是协议,www.baidu.com 是IP,端口默认80,/s是路径,参数是wd=yuan

请求方式: get与post请求

  • GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的请求体中.
  • GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制

响应状态码:状态码的职 是当客户端向服务器端发送请求时, 返回的请求 结果。借助状态码,用户可以知道服务器端是正常 理了请求,还是出 现了 。状态码如200 OK,以3位数字和原因 组成。

1.2、api接口

在开发Web应用中,有两种应用模式:

  1. 前后端不分离[客户端看到的内容和所有界面效果都是由服务端提供出来的。]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wB8IvpyJ-1689471141828)(assets/depended_frontend_backend.png)]

  1. 前后端分离【把前端的界面效果(html,css,js分离到另一个服务端,python服务端只需要返回数据即可)】

前端形成一个独立的网站,服务端构成一个独立的网站

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MkKUBjuZ-1689471141828)(assets/indepent_frontend_backend-16318493319127.png)]

应用程序编程接口(Application Programming Interface,API接口),就是应用程序对外提供了一个操作数据的入口,这个入口可以是一个函数或类方法,也可以是一个url地址或者一个网络地址。当客户端调用这个入口,应用程序则会执行对应代码操作,给客户端完成相对应的功能。

当然,api接口在工作中是比较常见的开发内容,有时候,我们会调用其他人编写的api接口,有时候,我们也需要提供api接口给其他人操作。由此就会带来一个问题,api接口往往都是一个函数、类方法、或者url或其他网络地址,不断是哪一种,当api接口编写过程中,我们都要考虑一个问题就是这个接口应该怎么编写?接口怎么写的更加容易维护和清晰,这就需要大家在调用或者编写api接口的时候要有一个明确的编写规范!!!

为了在团队内部形成共识、防止个人习惯差异引起的混乱,我们都需要找到一种大家都觉得很好的接口实现规范,而且这种规范能够让后端写的接口,用途一目了然,减少客户端和服务端双方之间的合作成本。

目前市面上大部分公司开发人员使用的接口实现规范主要有:restful、RPC。

REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移。 它首次出现在2000年Roy Fielding的博士论文中。

RESTful是一种专门为Web 开发而定义API接口的设计风格,尤其适用于前后端分离的应用模式中。

关键:面向资源开发

这种风格的理念认为后端开发任务就是提供数据的,对外提供的是数据资源的访问接口,所以在定义接口时,客户端访问的URL路径就表示这种要操作的数据资源。

而对于数据资源分别使用POST、DELETE、GET、UPDATE等请求动作来表达对数据的增删查改。

请求方法请求地址后端操作
POST/student/增加学生
GET/student/获取所有学生
GET/student/1获取id为1的学生
PUT/student/1修改id为1的学生
DELETE/student/1删除id为1的学生

restful规范是一种通用的规范,不限制语言和开发框架的使用。事实上,我们可以使用任何一门语言,任何一个框架都可以实现符合restful规范的API接口。

二、quick start

简单案例

安装

 
  

你还会需要一个 ASGI 服务器,生产环境可以使用 Uvicorn

 
  

代码

 
  

通过以下命令运行服务器:

 
  
 
  

也可以直接运行:

 
  

(1)导入 FastAPI。
(2)创建一个 app 实例。
(3)编写一个路径操作装饰器(如 @app.get(“/”))。
(4)编写一个路径操作函数(如上面的 def root(): …)
(5)定义返回值
(6)运行开发服务器(如 uvicorn main:app --reload)

此外,fastapi有着非常棒的交互式 API 文档,这一点很吸引人。

跳转到 http://127.0.0.1:8000/docs。你将会看到自动生成的交互式 API 文档。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p45FVS10-1689471141829)(assets/image-20220812090755216-0266479.png)]

三、路径操作

路径操作装饰器

fastapi支持各种请求方式:

 
  
 
  

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-co0H5roa-1689471141829)(assets/image-20220818163654321.png)]

路径操作装饰器参数:

 
  
include_router

main.py

 
  

与main.py同级目录apps:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZK6zfLw4-1689471141829)(assets/%E6%88%AA%E5%B1%8F2022-08-18%2012.09.40.png)]

 
  
 
  
 
  

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J64KekmT-1689471141830)(assets/image-20220818121552383.png)]

四、请求与响应

4.1、路径参数
(1)基本用法

以使用与 Python 格式化字符串相同的语法来声明路径"参数"或"变量":

 
  

路径参数 user_id 的值将作为参数 user_id 传递给你的函数。

(2)有类型的路径参数

你可以使用标准的 Python 类型标注为函数中的路径参数声明类型。

 
  

在这个例子中,user_id 被声明为 int 类型。

这将为你的函数提供编辑器支持,包括错误检查、代码补全等等。

(3)注意顺序

在创建路径操作时,你会发现有些情况下路径是固定的。

比如 /users/me,我们假设它用来获取关于当前用户的数据.

然后,你还可以使用路径 /user/{username} 来通过用户名 获取关于特定用户的数据。

由于路径操作是按顺序依次运行的,你需要确保路径 /user/me 声明在路径 /user/{username}之前:

 
  

否则,/user/{username} 的路径还将与 /user/me 相匹配,"认为"自己正在接收一个值为 "me"username 参数。

4.2、查询参数(请求参数)

路径函数中声明不属于路径参数的其他函数参数时,它们将被自动解释为"查询字符串"参数,就是 url? 之后用&分割的 key-value 键值对。

 
  

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bsCFlWVZ-1689471141830)(assets/image-20220929202111451.png)]

在这个例子中,函数参数 cityxl 是可选的,并且默认值为 None

自python3.5开始,PEP484为python引入了类型注解(type hints),typing的主要作用有:

  1. 类型检查,防止运行时出现参数、返回值类型不符。
  2. 作为开发文档附加说明,方便使用者调用时传入和返回参数类型。
  3. 模块加入不会影响程序的运行不会报正式的错误,pycharm支持typing检查错误时会出现黄色警告。

type hints主要是要指示函数的输入和输出的数据类型,数据类型在typing 包中,基本类型有str list dict等等,

Union 是当有多种可能的数据类型时使用,比如函数有可能根据不同情况有时返回str或返回list,那么就可以写成Union[list, str]
Optional 是Union的一个简化, 当 数据类型中有可能是None时,比如有可能是str也有可能是None,则Optional[str], 相当于Union[str, None]

4.3、请求体数据

当你需要将数据从客户端(例如浏览器)发送给 API 时,你将其作为「请求体」发送。请求体是客户端发送给 API 的数据。响应体是 API 发送给客户端的数据。

FastAPI 基于 PydanticPydantic 主要用来做类型强制检查(校验数据)。不符合类型要求就会抛出异常。

对于 API 服务,支持类型检查非常有用,会让服务更加健壮,也会加快开发速度,因为开发者再也不用自己写一行一行的做类型检查。

安装上手pip install pydantic

 
  

测试:

 
  

和声明查询参数时一样,当一个模型属性具有默认值时,它不是必需的。否则它是一个必需属性。将默认值设为 None 可使其成为可选属性。

FastAPI 会自动将定义的模型类转化为JSON Schema,Schema 成为 OpenAPI 生成模式的一部分,并显示在 API 交互文档中,查看 API 交互文档如下,该接口将接收application/json类型的参数。

FastAPI 支持同时定义 Path 参数、Query 参数和请求体参数,FastAPI 将会正确识别并获取数据。

参数在 url 中也声明了,它将被解释为 path 参数

参数是单一类型(例如int、float、str、bool等),它将被解释为 query 参数

参数类型为继承 Pydantic 模块的BaseModel类的数据模型类,则它将被解释为请求体参数

4.4、form表单数据

在 OAuth2 规范的一种使用方式(密码流)中,需要将用户名、密码作为表单字段发送,而不是 JSON。

FastAPI 可以使用Form组件来接收表单数据,需要先使用pip install python-multipart命令进行安装。

pip install python-multipart

 
  

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QYLOtw8y-1689471141830)(assets/image-20220929200207500-4452928.png)]

4.5、文件上传
 
  
4.6、Reqeust对象

有些情况下我们希望能直接访问Request对象。例如我们在路径操作函数中想获取客户端的IP地址,需要在函数中声明Request类型的参数,FastAPI 就会自动传递 Request 对象给这个参数,我们就可以获取到 Request 对象及其属性信息,例如 header、url、cookie、session 等。

 
  
4.7、请求静态文件

在 Web 开发中,需要请求很多静态资源文件(不是由服务器生成的文件),如 css/js 和图片文件等。

 
  
4.8、响应模型相关参数
(1)response_model

前面写的这么多路径函数最终 return 的都是自定义结构的字典,FastAPI 提供了 response_model 参数,声明 return 响应体的模型

 
  

response_model 是路径操作的参数,并不是路径函数的参数哦

FastAPI将使用response_model进行以下操作:

  • 将输出数据转换为response_model中声明的数据类型。
  • 验证数据结构和类型
  • 将输出数据限制为该model定义的
  • 添加到OpenAPI中
  • 在自动文档系统中使用。

你可以在任意的路径操作中使用 response_model 参数来声明用于响应的模型

案例:

  • 注册功能
  • 输入账号、密码、昵称、邮箱,注册成功后返回个人信息
 
  

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TUQP7O6W-1689471141830)(assets/image-20220816105323504.png)]

(2)response_model_exclude_unset

通过上面的例子,我们学到了如何用response_model控制响应体结构,但是如果它们实际上没有存储,则可能要从结果中忽略它们。例如,如果model在NoSQL数据库中具有很多可选属性,但是不想发送很长的JSON响应,其中包含默认值。

案例:

 
  

请求:http://127.0.0.1:8080/items/foo

不设置unset参数:

 
  

设置unset参数:

 
  

使用路径操作装饰器的 response_model 参数来定义响应模型,特别是确保私有数据被过滤掉。使用 response_model_exclude_unset 来仅返回显式设定的值。
除了response_model_exclude_unset以外,还有response_model_exclude_defaultsresponse_model_exclude_none,我们可以很直观的了解到他们的意思,不返回是默认值的字段和不返回是None的字段。

(3)INCLUDE和EXCLUDE
 
  

五、jinja2模板

要了解jinja2,那么需要先理解模板的概念。模板在Python的web开发中⼴泛使⽤,它能够有效的将业务逻辑和页⾯逻辑分开,使代码可读性增强、并且更加容易理解和维护。
模板简单来说就是⼀个其中包涵占位变量表⽰动态的部分的⽂件,模板⽂件在经过动态赋值后,返回给⽤户。

jinja2是Flask作者开发的⼀个模板系统,起初是仿django模板的⼀个模板引擎,为Flask提供模板⽀持,由于其灵活,快速和安全等优点被⼴泛使⽤。

在jinja2中,存在三种语法:

  1. 变量取值 { { }}
  2. 控制结构 {% %}
5.1、jinja2 的变量

Main.py

 
  
 
  
5.2、jinja2 的过滤器

变量可以通过“过滤器”进⾏修改,过滤器可以理解为是jinja2⾥⾯的内置函数和字符串处理函数。常⽤的过滤器有:

过滤器名称说明
capitialize把值的⾸字母转换成⼤写,其他⼦母转换为⼩写
lower把值转换成⼩写形式
title把值中每个单词的⾸字母都转换成⼤写
trim把值的⾸尾空格去掉
striptags渲染之前把值中所有的HTML标签都删掉
join拼接多个值为字符串
round默认对数字进⾏四舍五⼊,也可以⽤参数进⾏控制
safe渲染时值不转义

那么如何使⽤这些过滤器呢?只需要在变量后⾯使⽤管道(|)分割,多个过滤器可以链式调⽤,前⼀个过滤器的输出会作为后⼀个过滤
器的输⼊。

 
  
5.3、jinja2 的控制结构
5.3.1、分支控制

jinja2中的if语句类似与Python的if语句,它也具有单分⽀,多分⽀等多种结构,不同的是,条件语句不需要使⽤冒号结尾,⽽结束控制语句,需要使⽤endif关键字

 
  
5.3.2、循环控制

jinja2中的for循环⽤于迭代Python的数据类型,包括列表,元组和字典。在jinja2中不存在while循环。

 
  

六、ORM操作

在大型的web开发中,我们肯定会用到数据库操作,那么FastAPI也支持数据库的开发,你可以用 PostgreSQL、MySQL、 SQLite Oracle 等。本文用SQLite为例。我们看下在fastapi是如何操作设计数据库的。

fastapi是一个很优秀的框架,但是缺少一个合适的orm,官方代码里面使用的是sqlalchemy,Tortoise ORM 是受 Django 启发的易于使用的异步 ORM (对象关系映射器)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pr32ECW7-1689471141831)(assets/image-20220826133201772.png)]

Tortoise ORM文档

Tortoise ORM 目前支持以下数据库:

  • PostgreSQL >= 9.4(使用asyncpg
  • SQLite(使用aiosqlite
  • MySQL/MariaDB(使用aiomysql或使用asyncmy)
6.1、创建模型

以选课系统为例:

models.py

 
  
6.2、aerich迁移工具

main.py

 
  

settings.py

 
  

aerich是一种ORM迁移工具,需要结合tortoise异步orm框架使用。安装aerich

 
  
1. 初始化配置,只需要使用一次
 
  

初始化完会在当前目录生成一个文件:pyproject.toml和一个文件夹:migrations

  • pyproject.toml:保存配置文件路径,低版本可能是aerich.ini
  • migrations:存放迁移文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Wuys10N-1689471141831)(assets/image-20220827153323097.png)]

2. 初始化数据库,一般情况下只用一次
 
  
  1. 此时数据库中就有相应的表格

  2. 如果TORTOISE_ORM配置文件中的models改了名,则执行这条命令时需要增加--app参数,来指定你修改的名字

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mTFV4qvS-1689471141831)(assets/image-20220827155112380.png)]

3. 更新模型并进行迁移

修改model类,重新生成迁移文件,比如添加一个字段

 
  
 
  

迁移文件名的格式为 {version_num}{datetime}{name|update}.json。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fwDsWI0B-1689471141831)(assets/image-20220827155526583.png)]

注意,此时sql并没有执行,数据库中admin表中没有xxx字段

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eLqsLvdt-1689471141832)(assets/image-20220827160001201.png)]

4. 重新执行迁移,写入数据库
 
  

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0mACILys-1689471141832)(assets/image-20220827160341770.png)]

5. 回到上一个版本
 
  

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qMh24SaA-1689471141832)(assets/image-20220827160654426.png)]

6. 查看历史迁移记录
 
  

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uY6zUG3b-1689471141832)(assets/image-20220827160916018.png)]

6.3、api接口与restful规范
api接口

应用程序编程接口(Application Programming Interface,API接口),就是应用程序对外提供了一个操作数据的入口,这个入口可以是一个函数或类方法,也可以是一个url地址或者一个网络地址。当客户端调用这个入口,应用程序则会执行对应代码操作,给客户端完成相对应的功能。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I1k7g11O-1689471141833)(assets/image-20221013160754152-5648475.png)]

当然,api接口在工作中是比较常见的开发内容,有时候,我们会调用其他人编写的api接口,有时候,我们也需要提供api接口给其他人操作。由此就会带来一个问题,api接口往往都是一个函数、类方法、或者url或其他网络地址,不断是哪一种,当api接口编写过程中,我们都要考虑一个问题就是这个接口应该怎么编写?接口怎么写的更加容易维护和清晰,这就需要大家在调用或者编写api接口的时候要有一个明确的编写规范!!!

restful规范

为了在团队内部形成共识、防止个人习惯差异引起的混乱,我们都需要找到一种大家都觉得很好的接口实现规范,而且这种规范能够让后端写的接口,用途一目了然,减少客户端和服务端双方之间的合作成本。

目前市面上大部分公司开发人员使用的接口实现规范主要有:restful、RPC。

REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”或“表现层状态转化”。

简单来说,REST的含义就是客户端与Web服务器之间进行交互的时候,使用HTTP协议中的4个请求方法代表不同的动作。

GET用来获取资源

POST用来新建资源

PUT用来更新资源

DELETE用来删除资源。

只要API程序遵循了REST风格,那就可以称其为RESTful API。目前在前后端分离的架构中,前后端基本都是通过RESTful API来进行交互。

例如,我们现在要编写一个选课系统的接口,我们可以查询对一个学生进行查询、创建、更新和删除等操作,我们在编写程序的时候就要设计客户端浏览器与我们Web服务端交互的方式和路径。

而对于数据资源分别使用POST、DELETE、GET、UPDATE等请求动作来表达对数据的增删查改。

GET/students获取所有学生
请求方法请求地址后端操作
GET/students获取所有学生
POST/students增加学生
GET/students/1获取编号为1的学生
PUT/students/1修改编号为1的学生
DELETE/students/1删除编号为1的学生
6.4、选课系统接口开发

api/student.py

 
  

七、中间件与CORS

7.1、中间件

你可以向 FastAPI 应用添加中间件.

"中间件"是一个函数,它在每个请求被特定的路径操作处理之前,以及在每个响应之后工作.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FlRSxqxe-1689471141833)(assets/%E6%88%AA%E5%B1%8F2022-08-18%2013.22.24.png)]

如果你使用了 yield 关键字依赖, 依赖中的退出代码将在执行中间件执行.

如果有任何后台任务(稍后记录), 它们将在执行中间件运行.

要创建中间件你可以在函数的顶部使用装饰器 @app.middleware("http").

中间件参数接收如下参数:

  • request.
  • 一个函数call_next,它将接收request,作为参数.
    • 这个函数将 request 传递给相应的 路径操作.
    • 然后它将返回由相应的路径操作生成的 response.
  • 然后你可以在返回 response 前进一步修改它.
 
  
7.2、CORS
 
  
 
  
 
 

转载:https://blog.csdn.net/weixin_53909748/article/details/131747197
https://www.yuque.com/gengdiniu/vt4aq6/gygwu471ql38nzaq?singleDoc#ISclm
学习视频地址:https://www.bilibili.com/video/BV1Ya4y1D7et/?p=2&spm_id_from=pageDriver&vd_source=f90f7a1cc1fcfa7341c9b24943640b9d

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

春运倒计时,AR 引领铁路运输安全新风向

根据中国交通新闻网发布最新消息,今年春运全国跨区域人员流动量预计达 90 亿人次。 随着春运期间旅客数量不断创下新高,铁路运输面临着空前的挑战与压力。 图源:pixabay 聚焦铁路运输效率与旅客安全保障问题,本期行业趋势将探讨 …

在 Vue 项目中,可以通过设置不同的环境变量来区分不同的环境,例如本地开发环境、测试环境和生产环境。以下是设置环境变量的步骤:

1、在src下新建三个文件夹 (.env.local、.env.test 和 .env.prod) 2、配置信息 .env.local VUE_APP_ENVlocal VUE_APP_API_URLhttp://localhost:8080.env.test VUE_APP_ENVtest VUE_APP_API_URLhttp://124.220.110.203:9090/ .env.prod VUE_APP_…

看门狗定时器

1. 看门狗 看门狗: 用于设备在 程序异常(死机) 时 可以自动重启设备 实现原理: 通过定时器 进行定时 , 在定时器时间结束前 进行 "喂狗" 重置定时器时间 若时间到,还没有"喂狗",系统重启 本质就是一个定时器, 如何定时? 定时器 本质是对 晶振时钟进行 计…

上位机图像处理和嵌入式模块部署(c/c++ opencv)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 opencv可以运行在多个平台上面,当然windows平台也不意外。目前来说,opencv使用已经非常方便了,如果不想自己编译…

前端工程化之上cdn

一、cdn介绍 cdn的使用还是和前端打包相关,我们都希望前端最后的打包页面越小越好。那么可不可以把一些包不pack进去,让用户的流浪器自行下载呢?答案是可以的,那这些包就会被托管到分发站点上,就是在全国都有服务器&a…

【C++】STL和vector容器

STL和vector容器 基本概念六大组件容器算法迭代器容器算法迭代器 vector容器基本概念vector构造函数赋值vector的容量和大小vector插入与删除vector存取数据函数原型 vector互换容器vector预留空间vector容器嵌套容器 基本概念 长久以来,软件届一直希望建立一种可重…

解决 github.com port 443: Timed out 的问题

国内访问github.com总是那么不竟如人意,时而无法加载网页,时而等我们抽完了一根烟后,它还处于转圈的状态。 虽然国内有gitee.com等诸多的代码托管平台,但却鲜有国人愿意去呢?其中的缘由,想必也不用我多说&a…

SkiaSharp:.NET强大而灵活的跨平台图形库

在.Net 6之前,我们一般是使用System.Drawing.Common来生成图像。 但在.Net 6平台需要配置,才能在非Windows平台使用System.Drawing.Common。而从.Net 7开始,非Windows不再允许使用,官方也给我们推荐了几个替代库。 今天我们一起来…

MySQL索引类型及数据结构【笔记】

1 索引类型 返回面试宝典 主键索引(PRIMARY):数据列不允许重复,不允许为NULL,一个表只能有一个主键。 唯一索引(UNIQUE):数据列不允许重复,允许为NULL,一个表允许多个列创建唯一索引…

软考之项目管理

一、考点分布 盈亏平衡分析(※)进度管理(※※※)软件质量管理(※※)软件配置管理(※※) 二、盈亏平衡分析 正常情况下,销售额固定成本可变成本税费利润 盈亏平衡下&#…

JDK8新特性:Stream

Stream 认识Stream 也叫Stream流,是jdk8开始新增的一套API(java.util.stream.*),可以用于操作集合或者数组的数据。优势:Stream流大量的结合了Lambda的语法风格来编程,提供了一种更强大,更加简…

SSH:加密安全访问网络的革命性协议

目录 博客前言 一.ssh介绍 1.为什么需要SSH? 2.SSH是如何工作的? 连接建立 版本协商 算法协商 密钥交换 用户认证 会话请求 会话交互 3.SSH和SSL的区别 二.实战(centos配置密钥) 2.1.ssh/里面的文件作用解释 2.1 配…

【C++】std::variant

上一篇文章讲到了 union,union union存在很多问题,因此C17设计了一个新的variant替代原来的union。 union的问题 无法知道当前使用的类型是什么。而且union无法自动调用底层数据成员的析构函数。 这些使得一般只对一些“基本类型”使用union&#xf…

处理 Maven jar 包下载失败问题

目录 1、配置国内 Maven 源 配置和检测 settings.xml 配置国内源 2、删除本地 maven 创库的 jar 重新下载 3、其他问题 一般情况下 maven jar 包下载不成功可能有两种情况: 1)没有配置国内源 2)jar 包需要重新下载 下面详细讲解如何解决这两…

机器学习 | 利用Pandas进入高级数据分析领域

目录 初识Pandas Pandas数据结构 基本数据操作 DataFrame运算 文件读取与存储 高级数据处理 初识Pandas Pandas是2008年WesMcKinney开发出的库,专门用于数据挖掘的开源python库,以Numpy为基础,借力Numpy模块在计算方面性能高的优势&am…

【计网·湖科大·思科】实验二 计算机网络的寻址问题

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…

物联网IOT: 风浆叶片拧紧装配及实时监测系统

某大型风电设备,通过机器人应用与精益化生产体系的融合,打造出行业领先的具备柔性生产能力的“脉动式”生产体系。同时在关键工序上。其中,在叶片装配等关键工序上使用由智能机器人代替人工,以提高生产的效率和装配质量可靠性,将六轴机器人、视觉系统、光电系统、液压、气动、伺…

RISC-V常用汇编指令

RISC-V寄存器表: RISC-V和常用的x86汇编语言存在许多的不同之处,下面将列出其中部分指令作用: 指令语法描述addiaddi rd,rs1,imm将寄存器rs1的值与立即数imm相加并存入寄存器rdldld t0, 0(t1)将t1的值加上0,将这个值作为地址,取…

科技助力“双碳”:墨水屏电子桌牌在绿色办公中的作用

随着科技的发展,人们对绿色环境可持续发展也越来越重视,所以,我国在几年前,就提出了“双碳”政策(即碳达峰与碳中和的简称。2020年9月中国明确提出2030年“碳达峰”与2060年“碳中和”目标),而作…

DNS欺骗

DNS(域名系统)作为当前全球最大 、最复杂的分布式层次数据库系统,具有着开放、庞大、复杂的特性。它为全球用户提供域名解析服务,是互联网的重要基础设施。但由于其在设计之初未考虑安全性、人为破坏等因素 ,DNS系统在互联网高度发达的今天面…