Python从零开始搭建一个FastAPI应用并uvicorn启动

1,210 阅读5分钟

创建一个基本的FastAPI项目并使用uvicorn启动非常简单。以下是一个从零开始的详尽步骤指南:


1. 安装必要的依赖

确保你已经安装了Python 3.7+。然后通过pip安装FastAPI和uvicorn

# 创建虚拟环境(可选,但推荐)
python -m venv venv
source venv/bin/activate  # Linux/macOS
venv\Scripts\activate     # Windows

# 安装FastAPI和uvicorn
pip install fastapi uvicorn

2. 创建项目文件结构

创建一个项目文件夹(例如my_fastapi_project),目录结构如下:

my_fastapi_project/
├── main.py   # 主入口文件

main.py文件是FastAPI应用的核心,稍后我们将编写代码到这里。


3. 编写FastAPI应用代码

main.py中,添加以下代码:

from fastapi import FastAPI

# 创建一个FastAPI实例
app = FastAPI()

# 创建一个简单的路由,处理根路径 GET 请求
@app.get("/")
def read_root():
    return {"message": "Hello, FastAPI!"}

# 创建一个带参数的路由
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

这段代码:

  1. 创建了一个FastAPI实例。

  2. 定义了两个路由:

    • / 根路由,返回一个简单的JSON响应。
    • /items/{item_id} 路由,支持路径参数item_id和查询参数q

4. 启动应用

使用uvicorn启动应用:

uvicorn main:app --host 0.0.0.0 --port 8000 --reload

解释:

  • main:app:第一个 main 是文件名(main.py),第二个 app 是 FastAPI 应用实例(Python 变量)
  • --host:指定监听的地址,0.0.0.0 允许从外部访问。
  • --port:指定端口号,默认为 8000。
  • --reload:启用代码热重载,开发时使用,可以在改动代码时自动重启服务器。

5. 测试API

当应用启动后,你会看到类似的输出:

PS E:\osm\pytest> python -m venv venv
PS E:\osm\pytest> venv\scripts\activate
(venv) PS E:\osm\pytest> pip install fastapi uvicorn
Collecting fastapi
  Downloading fastapi-0.115.8-py3-none-any.whl.metadata (27 kB)
Collecting uvicorn
  Downloading uvicorn-0.34.0-py3-none-any.whl.metadata (6.5 kB)
Collecting starlette<0.46.0,>=0.40.0 (from fastapi)
  Downloading starlette-0.45.3-py3-none-any.whl.metadata (6.3 kB)
Collecting pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4 (from fastapi)
  Downloading pydantic-2.10.6-py3-none-any.whl.metadata (30 kB)
Collecting typing-extensions>=4.8.0 (from fastapi)
  Downloading typing_extensions-4.12.2-py3-none-any.whl.metadata (3.0 kB)
Collecting click>=7.0 (from uvicorn)
  Downloading click-8.1.8-py3-none-any.whl.metadata (2.3 kB)
Collecting h11>=0.8 (from uvicorn)
  Downloading h11-0.14.0-py3-none-any.whl.metadata (8.2 kB)
Collecting colorama (from click>=7.0->uvicorn)
  Downloading colorama-0.4.6-py2.py3-none-any.whl.metadata (17 kB)
Collecting annotated-types>=0.6.0 (from pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4->fastapi)
  Downloading annotated_types-0.7.0-py3-none-any.whl.metadata (15 kB)
Collecting pydantic-core==2.27.2 (from pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4->fastapi)
  Downloading pydantic_core-2.27.2-cp313-cp313-win_amd64.whl.metadata (6.7 kB)
Collecting anyio<5,>=3.6.2 (from starlette<0.46.0,>=0.40.0->fastapi)
  Downloading anyio-4.8.0-py3-none-any.whl.metadata (4.6 kB)
Collecting idna>=2.8 (from anyio<5,>=3.6.2->starlette<0.46.0,>=0.40.0->fastapi)
  Downloading idna-3.10-py3-none-any.whl.metadata (10 kB)
Collecting sniffio>=1.1 (from anyio<5,>=3.6.2->starlette<0.46.0,>=0.40.0->fastapi)
  Downloading sniffio-1.3.1-py3-none-any.whl.metadata (3.9 kB)
Downloading fastapi-0.115.8-py3-none-any.whl (94 kB)
Downloading uvicorn-0.34.0-py3-none-any.whl (62 kB)
Downloading click-8.1.8-py3-none-any.whl (98 kB)
Downloading h11-0.14.0-py3-none-any.whl (58 kB)
Downloading pydantic-2.10.6-py3-none-any.whl (431 kB)
Downloading pydantic_core-2.27.2-cp313-cp313-win_amd64.whl (2.0 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.0/2.0 MB 5.3 MB/s eta 0:00:00
Downloading starlette-0.45.3-py3-none-any.whl (71 kB)
Downloading typing_extensions-4.12.2-py3-none-any.whl (37 kB)
Downloading annotated_types-0.7.0-py3-none-any.whl (13 kB)
Downloading anyio-4.8.0-py3-none-any.whl (96 kB)
Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)
Downloading idna-3.10-py3-none-any.whl (70 kB)
Downloading sniffio-1.3.1-py3-none-any.whl (10 kB)
Installing collected packages: typing-extensions, sniffio, idna, h11, colorama, annotated-types, pydantic-core, click, anyio, uvicorn, starlette, pydantic, fastapi
Successfully installed annotated-types-0.7.0 anyio-4.8.0 click-8.1.8 colorama-0.4.6 fastapi-0.115.8 h11-0.14.0 idna-3.10 pydantic-2.10.6 pydantic-core-2.27.2 sniffio-1.3.1 starlette-0.45.3 typing-extensions-4.12.2 uvicorn-0.34.0

[notice] A new release of pip is available: 24.3.1 -> 25.0.1
[notice] To update, run: python.exe -m pip install --upgrade pip
(venv) PS E:\osm\pytest> uvicorn main:app --host 0.0.0.0 --port 8000 --reload
INFO:     Will watch for changes in these directories: ['E:\\osm\\pytest']
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [22348] using StatReload
INFO:     Started server process [3264]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     127.0.0.1:22588 - "GET / HTTP/1.1" 200 OK
INFO:     127.0.0.1:22716 - "GET /items/123?q=456 HTTP/1.1" 200 OK
INFO:     127.0.0.1:24622 - "GET /docs HTTP/1.1" 200 OK

打开浏览器访问 http://127.0.0.1:8000,你会看到:

{"message": "Hello, FastAPI!"}

image.png image.png

访问 http://127.0.0.1:8000/docs,你可以查看由FastAPI自动生成的Swagger API文档。

image.png


6. 添加到requirements.txt(可选)

如果你计划部署应用到其他环境,可以将依赖项记录到requirements.txt中:

pip freeze > requirements.txt

image.png

下面是生成的内容

annotated-types==0.7.0
anyio==4.8.0
click==8.1.8
colorama==0.4.6
fastapi==0.115.8
h11==0.14.0
idna==3.10
pydantic==2.10.6
pydantic_core==2.27.2
sniffio==1.3.1
starlette==0.45.3
typing_extensions==4.12.2
uvicorn==0.34.0


7. 关闭虚拟环境(可选)

如果你使用了虚拟环境,在完成工作后可以退出:

deactivate

通过以上步骤,你已经成功创建并运行了一个基本的FastAPI项目!🎉

8. Python的内置模块

  1. 数据处理和系统相关
import os          # 操作系统接口,文件和目录操作
import sys         # 系统相关的参数和函数
import time        # 时间相关功能
import datetime    # 日期和时间处理
import random      # 生成随机数
import json        # JSON 数据处理
import csv         # CSV 文件读写
  1. 数学和科学计算
import math        # 数学运算
import statistics  # 统计功能
import decimal    # 十进制定点和浮点运算
  1. 数据结构和算法
import collections  # 提供额外的数据结构(如 defaultdict, Counter)
import heapq       # 堆队列算法
import array       # 数组数据结构
import bisect      # 数组二分查找算法
  1. 字符串和文本处理
import string      # 字符串常量和模板
import re          # 正则表达式
  1. 文件和目录处理
import pathlib     # 面向对象的文件系统路径
import shutil      # 高级文件操作
import tempfile    # 临时文件和目录
  1. 并发和异步处理
import threading   # 多线程
import multiprocessing  # 多进程
import asyncio     # 异步 IO
import concurrent.futures  # 线程池和进程池
  1. 网络相关
import urllib      # URL 处理
import http        # HTTP 协议
import socket      # 底层网络接口
import email       # 电子邮件处理
  1. 数据压缩和归档
import zlib        # 数据压缩
import gzip        # gzip 压缩
import zipfile     # ZIP 文件处理
import tarfile     # TAR 文件处理
  1. 调试和性能
import logging     # 日志记录
import unittest    # 单元测试
import timeit      # 代码计时
import pdb        # 调试器

常用示例:

# 文件和目录操作
import os
print(os.getcwd())  # 获取当前工作目录
os.makedirs("new_dir", exist_ok=True)  # 创建目录

# 日期时间处理
from datetime import datetime, timedelta
now = datetime.now()
tomorrow = now + timedelta(days=1)

# JSON 处理
import json
data = {"name": "张三", "age": 25}
json_str = json.dumps(data, ensure_ascii=False)

# 随机数生成
import random
print(random.randint(1, 100))  # 生成1-100之间的随机整数

# 正则表达式
import re
text = "我的电话是123-4567-8900"
phone = re.search(r'\d{3}-\d{4}-\d{4}', text)

# 文件路径处理
from pathlib import Path
p = Path('.')
for file in p.glob('*.py'):  # 列出所有Python文件
    print(file)

这些模块都是 Python 标准库的一部分,不需要额外安装。它们提供了丰富的功能,能够满足大多数基本的编程需求。根据具体的项目需求,你可以选择合适的模块来使用。

要查看某个模块的详细文档,可以使用:

help(模块名)  # 例如:help(os)

或者访问 Python 官方文档:docs.python.org/zh-cn/3/lib…