FastApi教程|部署方式

发表时间:2020-03-09

部署 FastAPI 应用程序相对容易。

有多种方法可以执行此操作,具体取决于您的特定用例和使用的工具。

在接下来的部分中,您将更多地了解一些实现方法。

FastAPI版本

FastAPI 已经在许多应用程序和系统的生产中使用。 并且测试覆盖率保持在100%。 但是其发展仍在迅速发展。

经常添加新功能,定期修复错误,并且代码仍在不断改进。

这就是当前版本仍为的原因 0.x.x ,这表明每个版本都可能具有重大更改。 这遵循 语义版本 约定。

您可以立即使用 FastAPI 创建生产应用程序 (并且您可能已经做过一段时间了),只需确保使用的版本与其余代码都可以正确使用。

固定您 fastapi 的版本

您应该做的第一件事是将 要使用 的 FastAPI 版本“固定” 到特定的最新版本,该特定版本对于您的应用程序是正确的。

例如,假设您 0.45.0 在应用程序 中使用版本 。

如果使用 requirements.txt 文件,则可以 使用以下 命令指定版本:

fastapi==0.45.0

那将意味着您将完全使用版本 0.45.0

或者,您也可以将其固定为:

fastapi>=0.45.0,<0.46.0

这表示您将使用版本 0.45.0 或更高 版本 ,但小于 0.46.0 ,例如, 0.45.2 仍将接受 版本 。

如果您使用其他任何工具来管理安装,例如Poetry,Pipenv或其他工具,那么它们都可以用来定义软件包的特定版本。

可用版本

您可以在 发行说明中 查看可用版本(例如,检查最新版本) 。

关于版本

遵循语义版本约定,以下任何版本都 1.0.0 可能会添加重大更改。

FastAPI还遵循以下约定:任何“ PATCH”版本更改均用于错误修复和不间断的更改。

小费

“ PATCH”是最后一个数字,例如, 0.2.3 PATCH版本是中的 3

因此,您应该可以固定到以下版本:

fastapi>=0.45.0,<0.46.0

“ MINOR”版本中添加了重大更改和新功能。

小费

“ MINOR”是中间的数字,例如 0.2.3 MINOR版本中的数字是 2

升级FastAPI版本

您应该为您的应用添加测试。

使用 FastAPI, 这非常容易(感谢Starlette),请检查文档: 测试

测试完成后,您可以将 FastAPI 版本 升级到 最新 版本,并通过运行测试来确保所有代码都能正常工作。

如果一切正常,或者进行了必要的更改之后,并且所有测试都通过了,则可以将其固定 fastapi 到新的最新版本。

关于Starlette

您不应该固定的版本 starlette

不同版本的 FastAPI 将使用特定的较新版本的Starlette。

因此,您可以让 FastAPI 使用正确的Starlette版本。

关于Pydantic

Pydantic包含针对 FastAPI 的测试 及其自己的测试,因此Pydantic的新版本(上述 1.0.0 )始终与FastAPI兼容。

您可以将Pydantic固定到 1.0.0 适用于您的以下 任何版本 2.0.0

例如:

pydantic>=1.2.0,<2.0.0

泊坞窗

在本节中,您将看到说明和指南链接,以了解如何:

  • 使您的 FastAPI 应用程序成为具有最佳性能的Docker映像/容器。 在大约 5分钟内
  • (可选)了解您作为开发人员需要了解的有关HTTPS的知识。
  • 即使是在每月5美元的简单服务器上,也可以使用自动HTTPS设置Docker Swarm模式集群。 在 20分钟左右
  • 使用您的Docker Swarm集群以及HTTPS等 生成并部署完整的 FastAPI 应用程序。大约需要 10分钟

您可以使用 Docker 进行部署。 它具有一些优点,例如安全性,可复制性,开发简单性等。

如果您使用的是Docker,则可以使用官方的Docker映像:

tiangolo / uvicorn-gunicorn-fastapi

该映像包括一个“自动调整”机制,因此您只需添加代码即可自动获得很高的性能。 而且不做牺牲。

但是您仍然可以使用环境变量或配置文件来更改和更新所有配置。

小费

要查看所有配置和选项,请转到Docker映像页面: tiangolo / uvicorn-gunicorn-fastapi

创建 Dockerfile

  • 转到您的项目目录。
  • 创建一个 Dockerfile
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7

COPY ./app /app

更大的应用

如果遵循有关 使用多个文件 创建 更大的应用程序 的部分 ,则 Dockerfile 可能看起来像:

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7

COPY ./app /app/app

树莓派和其他架构

如果您在Raspberry Pi(具有ARM处理器)或任何其他体系结构中运行Docker,则可以 Dockerfile 基于Python基础映像(即多体系结构)从头开始 创建Docker, 并单独使用Uvicorn。

在这种情况下,您 Dockerfile 可能看起来像:

FROM python:3.7

RUN pip install fastapi uvicorn

EXPOSE 80

COPY ./app /app

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]

创建 FastAPI 代码

  • 创建一个 app 目录并输入。
  • 创建具有以下内容的 main.py 文件:
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}
  • 现在,您应该具有以下目录结构:
.
├── app
│   └── main.py
└── Dockerfile

构建Docker镜像

  • 转到项目目录(在您所在的 Dockerfile 位置,包含 app 目录)。
  • 构建您的FastAPI映像:
docker build -t myimage .

启动Docker容器

  • 根据您的图像运行一个容器:
docker run -d --name mycontainer -p 80:80 myimage

现在,您在Docker容器中有了优化的FastAPI服务器。 针对您当前的服务器(和CPU内核数)自动调整。

检查它

您应该能够在Docker容器的URL中检查它,例如: http : //192.168.99.100/items/5?q=somequery http://127.0.0.1/items/5?q=somequery (或等效查询) ,使用Docker主机)。

您会看到类似以下内容:

{"item_id": 5, "q": "somequery"}

交互式API文档

现在,您可以转到 http://192.168.99.100/docs http://127.0.0.1/docs (或使用Docker主机的等效文件)。

您将看到自动交互式API文档(由 Swagger UI 提供 ):

招摇UI

替代API文档

您还可以转到 http://192.168.99.100/redoc http://127.0.0.1/redoc (或等效的端口,使用Docker主机)。

您将看到替代的自动文档(由 ReDoc 提供 ):

ReDoc

HTTPS

关于 HTTPS

很容易假设HTTPS是否启用了。

但这要复杂得多。

小费

如果您着急或不在乎,请继续进行下一部分,逐步说明如何进行设置。

要从用户角度了解HTTPS的基础知识,请查看 https://howhttps.works/

现在,从开发人员的角度来看,在考虑HTTPS时要牢记以下几点:

  • 对于HTTPS,服务器需要具有第三方生成的“证书”。
    • 这些证书实际上是从第三方获取的,而不是“生成的”。
  • 证书有终身资格。
    • 他们到期了。
    • 然后需要对其进行更新,并再次从第三方那里获取。
  • 连接的加密发生在TCP级别。
    • 这是HTTP之下的一层。
    • 因此,证书和加密处理是在HTTP之前完成的。
  • TCP不了解“域”。 仅关于IP地址。
    • 有关请求的特定域的信息包含在HTTP数据中。
  • HTTPS证书“证明”特定域,但是协议和加密发生在TCP级别,然后才知道要处理哪个域。
  • 默认情况下,这意味着每个IP地址只能拥有一个HTTPS证书。
    • 无论您的服务器有多大,或服务器上的每个应用程序有多小。
    • 但是,有一个解决方案。
  • TLS协议有一个扩展(称为 SNI ,它是在HTTP之前在TCP级别处理加密的协议) 。
    • 此SNI扩展允许一台服务器(具有一个IP地址)具有多个HTTPS证书,并服务于多个HTTPS域/应用程序。
    • 为此,在服务器上运行的,侦听公用IP地址的单个组件(程序)必须在服务器中具有所有HTTPS证书。
  • 获取安全连接后,通信协议仍为HTTP。
    • 即使使用HTTP协议发送内容,内容也会被加密。

通常的做法是在服务器(计算机,主机等)上运行一个程序/ HTTP服务器并管理所有HTTPS部分:将解密的HTTP请求发送到在同一服务器( FastAPI)上 运行的实际HTTP应用程序 应用程序,在这种情况下),从应用程序获取HTTP响应,使用适当的证书对其进行加密,然后使用HTTPS将其发送回客户端。 该服务器通常称为 TLS终止代理

让我们加密

在进行加密之前,这些HTTPS证书是由受信任的第三方出售的。

获得这些证书之一的过程过去很麻烦,需要大量的文书工作,并且证书非常昂贵。

但随后 创建了“ 让我们加密”

它是Linux Foundation的项目。 它免费提供HTTPS证书。 以自动化的方式。 这些证书使用所有标准的密码安全性,并且寿命短(大约3个月),因此,由于它们的使用寿命缩短,因此安全性实际上更好。

域已经过安全验证,并且证书是自动生成的。 这也允许自动更新这些证书。

这个想法是使这些证书的获取和更新自动化,以便您可以永久免费获得安全的HTTPS。

Traefik

Traefik 是高性能的反向代理/负载平衡器。 它可以执行“ TLS终止代理”工作(其他功能除外)。

它与Let's Encrypt集成。 因此,它可以处理所有HTTPS部分,包括证书获取和更新。

它还与Docker集成在一起。 因此,您可以在每个应用程序配置中声明您的域,并让其读取这些配置,生成HTTPS证书,并自动将HTTPS提供给您的应用程序,而无需对其配置进行任何更改。


有了这些信息和工具,请继续下一节以结合所有内容。

带有Traefik和HTTPS的Docker Swarm模式集群

您可以在几分钟(约20分钟)内使用主要Traefik处理HTTPS(包括证书获取和续签)来设置Docker Swarm模式集群。

通过使用Docker Swarm模式,您可以从一台计算机的“集群”开始(它甚至可以是每月5美元的服务器),然后可以根据需要添加更多服务器而增长。

要设置具有Traefik和HTTPS处理能力的Docker Swarm模式集群,请遵循以下指南:

多克尔群模式和Traefik用于HTTPS簇

部署FastAPI应用程序

设置所有内容的最简单方法是使用 FastAPI 项目生成器

它被设计为与具有上述Traefik和HTTPS的Docker Swarm集群集成。

您可以在大约2分钟内生成一个项目。

生成的项目有部署说明,另外需要2分钟。

另外,部署 FastAPI 无码头工人

您也可以 直接 部署 FastAPI ,而无需Docker。

您只需要安装与ASGI兼容的服务器,例如:

  • Uvicorn 是一款闪电般快速的ASGI服务器,基于uvloop和httptools构建。
pip install uvicorn
  • Hypercorn ,也是与HTTP / 2兼容的ASGI服务器。
pip install hypercorn

...或任何其他ASGI服务器。

并以与教程中相同的方式运行应用程序,但没有 --reload 选择,例如:

uvicorn main:app --host 0.0.0.0 --port 80

或搭配Hypercorn:

hypercorn main:app --bind 0.0.0.0:80

您可能需要设置一些工具,以确保它停止时会自动重新启动。

您可能还需要安装 Gunicorn 并将 其用作Uvicorn的管理器 ,或将Hypercorn与多个工作人员一起使用。

确保微调工人人数等。

但是,如果您执行所有操作,则可能只使用自动执行的Docker映像。

文章来源互联网,如有侵权,请联系管理员删除。邮箱:417803890@qq.com / QQ:417803890

微配音

Python Free

邮箱:417803890@qq.com
QQ:417803890

皖ICP备19001818号
© 2019 copyright www.pythonf.cn - All rights reserved

微信扫一扫关注公众号:

联系方式

Python Free