» Python:使用Kafka构建事件驱动微服务 » 2. 生产者:Web服务 » 2.2 FastAPI Web 服务器

FastAPI Web 服务器

创建项目目录:lr_event_driven_py

创建虚拟环境

使用虚拟环境来隔离项目依赖项是一种最佳实践。你可以使用 Python 3 内置的 venv 模块创建虚拟环境。

python3 -m venv lrFastAPIEnv

警告
如果你使用 git 或其他版本管理系统,记得要忽略虚拟目录。 比如, .gitignore

+
+lrFastAPIEnv/

激活虚拟环境

此步骤各平台操作不同。

在 Windows 平台:

lrFastAPIEnv\Scripts\activate

在 macOS 和 Linux 平台:

source lrFastAPIEnv/bin/activate

管理依赖

在项目根目录创建名为 requirements.txt 的文件。该文件用于列出项目的依赖项及其具体版本。你可以使用如下命令自动生成文件:

pip3 freeze > requirements.txt

如果你的虚拟环境设置正确的话,你将会得到一个空文件 requirements.txt

安装

安装 FastAPI 框架:

pip3 install fastapi

你还需要安装一个 ASGI server,比如Uvicorn 或者 Hypercorn

pip3 install "uvicorn[standard]"

安装后,更新 ``requirements.txt`:

pip3 freeze > requirements.txt

此命令更新 requirements.txt 文件。其内容大致如下所示:

annotated-types==0.6.0
anyio==4.3.0
click==8.1.7
fastapi==0.110.1
h11==0.14.0
httptools==0.6.1
idna==3.6
pydantic==2.6.4
pydantic_core==2.16.3
python-dotenv==1.0.1
PyYAML==6.0.1
sniffio==1.3.1
starlette==0.37.2
typing_extensions==4.11.0
uvicorn==0.29.0
uvloop==0.19.0
watchfiles==0.21.0
websockets==12.0

创建模板目录

创建一个名为 templates 的目录,将 index.html 移进去。

调整页面标题:

- <h1 class="text-4xl font-bold">LiteRank Book Store</h1>
+ <h1 class="text-4xl font-bold">{{ title }}</h1>

{{ title }}Jinja 模板引擎的语法。 你可以为 FastAPI 选择任意模板引擎。不过,Jinja2 是一个比较热门的选项,其它工具如 Flask 也使用它。

安装 Jinja2

pip3 install Jinja2

记得更新 requirements.txt.

创建 main.py:

from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates

app = FastAPI()

templates = Jinja2Templates(directory="templates")


@app.get("/", response_class=HTMLResponse)
async def index_page(request: Request):
    return templates.TemplateResponse(
        name="index.html", context={"request": request, "title": "LiteRank Book Store"}
    )

如下运行程序:

uvicorn main:app --reload

命令 uvicorn main:app 含义:

  • main: 文件 main.py(Python “模块”)。
  • app: 在 main.py 中创建的对象名,比如:app = FastAPI()
  • --reload: 使得 server 在代码更新后自动重启。只适合开发环境下使用。

将得到类似如下信息:

INFO:     Will watch for changes in these directories: ['.../projects/lr_event_driven_py']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [22891] using watchgod
INFO:     Started server process [22893]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

你的 web 服务器已经在 8000 端口跑起来了。

尝试在浏览器中访问 http://localhost:8000/ 。它应该展示一个如之前章节设计的网页给你。

上页下页