跳到内容

手动运行服务器

使用 fastapi run 命令

简而言之,使用 fastapi run 来提供你的 FastAPI 应用程序服务

$ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:solid">main.py</u>

  <span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span>  Starting production server 🚀

             Searching for package file structure from directories
             with <font color="#3465A4">__init__.py</font> files
             Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>

   <span style="background-color:#007166"><font color="#D3D7CF"> module </font></span>  🐍 main.py

     <span style="background-color:#007166"><font color="#D3D7CF"> code </font></span>  Importing the FastAPI app object from the module with
             the following code:

             <u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u>

      <span style="background-color:#007166"><font color="#D3D7CF"> app </font></span>  Using import string: <font color="#3465A4">main:app</font>

   <span style="background-color:#007166"><font color="#D3D7CF"> server </font></span>  Server started at <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000</u></font>
   <span style="background-color:#007166"><font color="#D3D7CF"> server </font></span>  Documentation at <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000/docs</u></font>

             Logs:

     <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span>  Started server process <b>[</b><font color="#34E2E2"><b>2306215</b></font><b>]</b>
     <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span>  Waiting for application startup.
     <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span>  Application startup complete.
     <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span>  Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000</u></font> <b>(</b>Press CTRL+C
             to quit<b>)</b>

这在大多数情况下都适用。😎

例如,你可以使用该命令在容器、服务器等环境中启动你的 FastAPI 应用程序。

ASGI 服务器

让我们深入了解一下细节。

FastAPI 使用一个名为 ASGI 的标准来构建 Python Web 框架和服务器。FastAPI 是一个 ASGI Web 框架。

你在远程服务器机器上运行 FastAPI 应用程序(或任何其他 ASGI 应用程序)所需的主要是一个 ASGI 服务器程序,例如 Uvicorn,这是 `fastapi` 命令中默认附带的。

还有几种替代方案,包括

  • Uvicorn:一个高性能的 ASGI 服务器。
  • Hypercorn:一个兼容 HTTP/2 和 Trio 等特性的 ASGI 服务器。
  • Daphne:为 Django Channels 构建的 ASGI 服务器。
  • Granian:一个用于 Python 应用程序的 Rust HTTP 服务器。
  • NGINX Unit:NGINX Unit 是一个轻量级且多功能的 Web 应用程序运行时。

服务器机器和服务器程序

有一个小小的名称细节需要注意。💡

词语“服务器”通常既指远程/云计算机(物理机或虚拟机),也指在该机器上运行的程序(例如 Uvicorn)。

请记住,当你笼统地看到“服务器”时,它可能指这两种事物中的一种。

当指代远程机器时,通常称其为 服务器,但也可以称之为 机器VM(虚拟机)、节点。这些都指某种类型的远程机器,通常运行 Linux,用于运行程序。

安装服务器程序

当你安装 FastAPI 时,它会附带一个生产服务器 Uvicorn,你可以使用 `fastapi run` 命令来启动它。

但你也可以手动安装一个 ASGI 服务器。

确保你创建了 虚拟环境,激活它,然后就可以安装服务器应用程序。

例如,要安装 Uvicorn

$ pip install "uvicorn[standard]"

---> 100%

类似的过程也适用于任何其他 ASGI 服务器程序。

提示

通过添加 `standard`,Uvicorn 将安装并使用一些推荐的额外依赖。

这包括 `uvloop`,它是 `asyncio` 的高性能即插即用替代品,提供了巨大的并发性能提升。

当你使用 `pip install "fastapi[standard]"` 这样的命令安装 FastAPI 时,你也会同时获得 `uvicorn[standard]`。

运行服务器程序

如果你手动安装了 ASGI 服务器,通常需要以特殊格式传递一个导入字符串,以便它能够导入你的 FastAPI 应用程序

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

<span style="color: green;">INFO</span>:     Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)

注意

命令 `uvicorn main:app` 指的是

  • `main`:文件 `main.py`(Python“模块”)。
  • `app`:在 `main.py` 内部使用 `app = FastAPI()` 这一行创建的对象。

它等同于

from main import app

每个替代的 ASGI 服务器程序都会有类似的命令,你可以在它们各自的文档中阅读更多信息。

警告

Uvicorn 和其他服务器支持 `--reload` 选项,这在开发过程中很有用。

`--reload` 选项会消耗更多资源,更不稳定等。

它在 **开发** 过程中帮助很大,但你 **不应该** 在 **生产** 环境中使用它。

部署概念

这些示例运行服务器程序(例如 Uvicorn),启动 **单个进程**,在预定义的端口(例如 `80`)上监听所有 IP(`0.0.0.0`)。

这是基本思想。但你可能需要注意一些额外的事情,例如

  • 安全性 - HTTPS
  • 启动时运行
  • 重启
  • 复制(运行的进程数)
  • 内存
  • 启动前的准备步骤

在接下来的章节中,我将详细介绍这些概念,如何思考它们,以及一些处理它们的具体策略示例。🚀