Skip to content

手动运行服务器

使用 fastapi run 命令

简而言之,使用 fastapi run 来启动你的 FastAPI 应用:

$ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:single">main.py</u>
<font color="#3465A4">INFO    </font> 使用路径 <font color="#3465A4">main.py</font>
<font color="#3465A4">INFO    </font> 解析绝对路径 <font color="#75507B">/home/user/code/awesomeapp/</font><font color="#AD7FA8">main.py</font>
<font color="#3465A4">INFO    </font> 从包含 <font color="#3465A4">__init__.py</font> 文件的目录中搜索包文件结构
<font color="#3465A4">INFO    </font> 从 <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font> 导入

 ╭─ <font color="#8AE234"><b>Python 模块文件</b></font> ─╮
 │                      │
 │  🐍 main.py          │
 │                      │
 ╰──────────────────────╯

<font color="#3465A4">INFO    </font> 导入模块 <font color="#4E9A06">main</font>
<font color="#3465A4">INFO    </font> 找到可导入的 FastAPI 应用

 ╭─ <font color="#8AE234"><b>可导入的 FastAPI 应用</b></font> ─╮
 │                          │
 │  <span style="background-color:#272822"><font color="#FF4689">from</font></span><span style="background-color:#272822"><font color="#F8F8F2"> main </font></span><span style="background-color:#272822"><font color="#FF4689">import</font></span><span style="background-color:#272822"><font color="#F8F8F2"> app</font></span><span style="background-color:#272822">  </span>  │
 │                          │
 ╰──────────────────────────╯

<font color="#3465A4">INFO    </font> 使用导入字符串 <font color="#8AE234"><b>main:app</b></font>

 <font color="#4E9A06">╭─────────── FastAPI CLI - 生产模式 ───────────╮</font>
 <font color="#4E9A06">│                                                     │</font>
 <font color="#4E9A06">│  服务地址: http://0.0.0.0:8000                      │</font>
 <font color="#4E9A06">│                                                     │</font>
 <font color="#4E9A06">│  API 文档: http://0.0.0.0:8000/docs                 │</font>
 <font color="#4E9A06">│                                                     │</font>
 <font color="#4E9A06">│  正在生产模式下运行,开发模式请使用:               │</font>
 <font color="#4E9A06">│                                                     │</font>
 <font color="#4E9A06">│  </font><font color="#8AE234"><b>fastapi dev</b></font><font color="#4E9A06">                                        │</font>
 <font color="#4E9A06">│                                                     │</font>
 <font color="#4E9A06">╰─────────────────────────────────────────────────────╯</font>

<font color="#4E9A06">INFO</font>:     启动服务器进程 [<font color="#06989A">2306215</font>]
<font color="#4E9A06">INFO</font>:     等待应用启动。
<font color="#4E9A06">INFO</font>:     应用启动完成。
<font color="#4E9A06">INFO</font>:     Uvicorn 运行在 <b>http://0.0.0.0:8000</b> (按 CTRL+C 退出)

这在大多数情况下都能正常工作。😎

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

ASGI 服务器

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

FastAPI 使用了一种用于构建 Python Web 框架和服务器的标准,称为 ASGI。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服务器程序的安装过程与此类似。

Tip

通过添加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)

Note

命令uvicorn main:app指的是:

  • main:文件main.py(Python“模块”)。
  • app:在main.py中用app = FastAPI()行创建的对象。

它等同于:

from main import app

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

Warning

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

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

它在**开发**过程中非常有帮助,但在**生产**环境中**不应该**使用它。

部署概念

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

这是基本思路。但你可能会想要处理一些额外的事情,比如:

  • 安全性 - HTTPS
  • 开机自启
  • 重启
  • 复制(运行的进程数量)
  • 内存
  • 启动前的步骤

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