FastAPI 是一个现代化、快速(高性能)、基于标准 Python 类型提示构建的 Web 框架,非常适合开发 RESTful API。如果你有现成的 Python 函数,并希望通过 HTTP 请求调用它,FastAPI 可以帮助你快速实现。
在本文中,我们将介绍如何使用 FastAPI 将已有函数改造成 API,并通过 GET 和 POST 请求调用它。同时,我们还会展示如何在服务运行时,自定义主机地址、端口号以及启用 SSL 证书等高级配置。
首先,请确保你安装了 FastAPI 和 Uvicorn:
pip install fastapi uvicorn
假设我们有一个简单的函数,用于计算两数之和:
def add_numbers(a: int, b: int) -> int:
return a + b
接下来,我们将通过 FastAPI 将这个函数改造成一个可以通过 HTTP 请求调用的 API。
为了更灵活地管理服务和路由,我们将把 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
我们通过单独的函数将路由挂载到应用上:
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)}
运行服务时,可以配置主机地址、端口号以及支持 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)
以下是服务的主入口代码,支持通过命令行参数运行服务:
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)
你可以通过以下命令运行服务,并指定自定义参数:
运行以下命令(默认地址为 http://127.0.0.1:8000):
python main.py
运行以下命令,指定主机和端口:
python main.py --host 0.0.0.0 --port 8080
如果你有 SSL 私钥和证书文件,可以通过以下命令启用 HTTPS 服务:
python main.py --host 0.0.0.0 --port 8443 --ssl_keyfile "path/to/key.pem" --ssl_certfile "path/to/cert.pem"
服务启动后,你可以使用以下工具测试 API。
curl "http://127.0.0.1:8000/add?a=10&b=20"
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
}
curl -X POST "http://127.0.0.1:8000/add" -H "Content-Type: application/json" -d '{"a": 15, "b": 25}'
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
}
FastAPI 会自动生成交互式文档,你可以访问以下地址:
在 Swagger UI 中,你可以直接测试 API。
通过本教程,我们实现了以下内容:
FastAPI 的高性能、易用性和强大的功能,使其成为开发 Web API 的绝佳选择。如果你觉得本教程对你有帮助,记得点赞、收藏并分享!