引言
FastAPI 是一个现代化、快速(高性能)、基于标准 Python 类型提示构建的 Web 框架,非常适合开发 RESTful API。如果你有现成的 Python 函数,并希望通过 HTTP 请求调用它,FastAPI 可以帮助你快速实现。
在本文中,我们将介绍如何使用 FastAPI 将已有函数改造成 API,并通过 GET 和 POST 请求调用它。同时,我们还会展示如何在服务运行时,自定义主机地址、端口号以及启用 SSL 证书等高级配置。
1. 安装必要依赖
首先,请确保你安装了 FastAPI 和 Uvicorn:
pip install fastapi uvicorn
2. 定义已有的函数
假设我们有一个简单的函数,用于计算两数之和:
def add_numbers(a: int, b: int) -> int:
return a + b
接下来,我们将通过 FastAPI 将这个函数改造成一个可以通过 HTTP 请求调用的 API。
3. 编写 FastAPI 应用
为了更灵活地管理服务和路由,我们将把 FastAPI 的逻辑分成几个部分:创建应用、挂载路由和运行服务。
3.1 创建 FastAPI 应用
以下是创建应用的代码示例:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
APP_VERSION = "v1.0.0"
ENABLE_CORS = True
def create_app() -> FastAPI:
"""
创建 FastAPI 应用实例
"""
app = FastAPI(
title="Example API Server",
version=APP_VERSION,
description="这是一个示例服务,包含简单的数学操作 API",
)
# 启用跨域支持(CORS),允许所有来源
if ENABLE_CORS:
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
return app
3.2 挂载路由
我们通过单独的函数将路由挂载到应用上:
def mount_routes(app: FastAPI):
"""
挂载路由
"""
@app.get("/add", tags=["Math"], summary="两数相加")
def add(a: int, b: int):
"""
GET 请求:通过查询参数计算两数之和
"""
return {"result": add_numbers(a, b)}
@app.post("/add", tags=["Math"], summary="两数相加(POST 请求)")
def add_post(data: dict):
"""
POST 请求:通过请求体计算两数之和
"""
a = data.get("a")
b = data.get("b")
return {"result": add_numbers(a, b)}
3.3 运行服务
运行服务时,可以配置主机地址、端口号以及支持 SSL 的选项。以下是运行服务的代码:
import uvicorn
def run_server(app: FastAPI, host: str = "127.0.0.1", port: int = 8000, **kwargs):
"""
启动 FastAPI 服务
"""
if kwargs.get("ssl_keyfile") and kwargs.get("ssl_certfile"):
uvicorn.run(
app,
host=host,
port=port,
ssl_keyfile=kwargs.get("ssl_keyfile"),
ssl_certfile=kwargs.get("ssl_certfile"),
)
else:
uvicorn.run(app, host=host, port=port)
3.4 主入口
以下是服务的主入口代码,支持通过命令行参数运行服务:
import argparse
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="示例服务")
parser.add_argument("--host", type=str, default="0.0.0.0", help="主机地址")
parser.add_argument("--port", type=int, default=8000, help="端口号")
parser.add_argument("--ssl_keyfile", type=str, default=None, help="SSL 私钥文件路径")
parser.add_argument("--ssl_certfile", type=str, default=None, help="SSL 证书文件路径")
args = parser.parse_args()
# 创建应用
app = create_app()
# 挂载路由
mount_routes(app)
# 启动服务
run_server(app, host=args.host, port=args.port, ssl_keyfile=args.ssl_keyfile, ssl_certfile=args.ssl_certfile)
4. 启动服务
你可以通过以下命令运行服务,并指定自定义参数:
默认启动
运行以下命令(默认地址为 http://127.0.0.1:8000):
python main.py
自定义主机和端口
运行以下命令,指定主机和端口:
python main.py --host 0.0.0.0 --port 8080
启用 SSL 支持
如果你有 SSL 私钥和证书文件,可以通过以下命令启用 HTTPS 服务:
python main.py --host 0.0.0.0 --port 8443 --ssl_keyfile "path/to/key.pem" --ssl_certfile "path/to/cert.pem"
5. 测试 API
服务启动后,你可以使用以下工具测试 API。
测试 GET 请求
- 使用浏览器或 cURL 测试:
curl "http://127.0.0.1:8000/add?a=10&b=20"
- Python 客户端调用 API 的代码示例:
import requests
# GET 请求
url = "http://127.0.0.1:8000/add"
params = {"a": 10, "b": 20}
response = requests.get(url, params=params)
print("GET 请求响应:", response.json())
响应示例:
{
"result": 30
}
测试 POST 请求
- 使用 cURL 或 Postman 发送 POST 请求:
curl -X POST "http://127.0.0.1:8000/add" -H "Content-Type: application/json" -d '{"a": 15, "b": 25}'
- Python 客户端调用 API 的代码示例:
import requests
# POST 请求
url = "http://127.0.0.1:8000/add"
data = {"a": 15, "b": 25}
response = requests.post(url, json=data)
print("POST 请求响应:", response.json())
响应示例:
{
"result": 40
}
6. 自动生成文档
FastAPI 会自动生成交互式文档,你可以访问以下地址:
- Swagger UI: http://127.0.0.1:8000/docs
- ReDoc 文档: http://127.0.0.1:8000/redoc
在 Swagger UI 中,你可以直接测试 API。
7. 总结
通过本教程,我们实现了以下内容:
- 使用 FastAPI 将已有函数改造成 API。
- 支持 GET 和 POST 请求,并验证参数。
- 实现了跨域支持(CORS)。
- 支持通过命令行指定自定义主机、端口和启用 SSL。
- 提供自动生成的交互式文档。
FastAPI 的高性能、易用性和强大的功能,使其成为开发 Web API 的绝佳选择。如果你觉得本教程对你有帮助,记得点赞、收藏并分享!🎉