logo

FastAPI 部署

王哲峰 / 2022-12-01


目录

FastAPI 版本

FastAPI 可用版本

FastAPI 版本

fastapi>=0.45.0,<0.46.0

更新 FastAPI 版本

  1. 首先,应该使用 FastAPI 提供的测试功能测试 APP
  2. 然后,更新 FastAPI 到一个比较新的版本,然后在新版本的 FastAPI 中测试 APP
  3. 最后,如果一切 OK,或者做了必要的修改后,通过了所有的测试,那么可以将 FastAPI 的版本固定下来

Starlette

不应该固定 starlette 的版本,因为不同的 FastAPI 版本会使用最新版本的 Starlette

Pydantic

pydantic>=1.2.0,<2.0.0

HTTPS

Deta 部署 FastAPI

Docker 部署 FastAPI

tiangolo/uvicorn-gunicorn-fastapi

创建一个 Dockerfile

  1. 进入项目目录
$ mkdir fastapi_demo
$ cd fastapi_demo
  1. 创建一个 Dockerfile 文件
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7

COPY ./app /app
  1. 如果创建一个较大的 APP
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7

COPY ./app /app/app
  1. 如果在 Raspberry Pi(具有 ARM 处理器) 或任何其他体系结构中运行 Docker, 则 Dockerfile 可以基于 Python 基础镜像(即多体系结构)从头开始 Docker , 并单独使用 uvicorn
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 代码

  1. 创建一个 app 目录
  2. 在 app 目录中创建一个 main.py 文件
  3. 在 main.py 文件中写入以下内容
from typing import Optional
from fastapi import FastAPI

app = FastAPI()

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

@app.get("/items/{item_id}")
asynv def read_item(item_id: int, q: Optional[str] = None):
    return {
        "item_id": item_id,
        "q": q
    }

构建 Docker 镜像

  1. 进入项目目录(Dockerfile 所在目录)
$ cd fastapi_demo
  1. 构建 FastAPI 的 Docker 镜像
$ docker build -t myimage .

启动 Docker 容器

  1. 基于构建的 Docker 镜像启动一个 Docker 容器
$ docker run -d --name muycontainer -p 80:80 myimage
  1. 现在在 Docker 容器中有了一个优化的 FastAPI 服务器,并针对当前服务器的 CUP 内核数自动调整性能

检查

  1. 打开 http://192.168.99.100/items/5?q=somequery 或 http://127.0.0.1/items/5?somequery 可以看到
{"item_id": 5, "q": "somequery"}
  1. 打开 http://192.168.99.100/docs 或 http://127.0.0.1/docs
  2. 可选DOC http://192.168.99.100/redoc 或 http://127.0.0.1/redoc

Traefik

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

手动部署 FastAPI

手动部署 FastAPI 只需要安装 ASGI 兼容的服务器即可:

$ pip install uvicorn[standard]
$ pip install hypercorn

(2)运行 APP

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

(3)如果想确保服务器停止后自动重新启动