Python项目使用FastAPI和Uvicorn打造高性能API服务
FastAPI
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建基于 Python 的 API。它具有简单易用的特性,同时也提供了高度自动化的文档生成功能,使得开发者可以更加高效地构建和部署 API 服务。功能强大、易于使用且高性能的 Web 框架,适用于构建各种规模的 API 服务。它的简洁语法、自动生成文档和异步支持等特性使得开发 API 更加轻松和愉快。
FastAPI安装:pip install fastapi
- 可以在主文件中定义API访问入口
from fastapi import FastAPI # 创建API实例 app = FastAPI() # 定义收到不同Restful请求后的处理入口 @app.get("/") async def root(): return {"message": "Hello World"} @app.get("/items/{item_id}") async def read_item(item_id): return {"item_id": item_id}
- 也可以多个文件中定义不同的API访问入口
- 文件1.py
from fastapi import APIRouter # 定义APIRouter items_router = APIRouter() # 对应的Restful接口处理入口 @items_router.get("/items/{item_id}") async def read_item(item_id): return {"item_id": item_id} @items_router.get("/itemname/{item_id}") async def read_item_name(item_id): return {"item_name": "xxxx"}
- 文件2.py
from fastapi import APIRouter # 定义APIRouter anysis_router = APIRouter() # 对应的Restful接口处理入口 @anysis_router.get("/anysis/{item_id}") async def read_item(item_id): pass
- 主文件.py (如:main.py)
from fastapi import FastAPI # 创建API实例 app = FastAPI() # 引入定义的router app.include_router(items_router) app.include_router(anysis_router) # 定义收到不同Restful请求后的处理入口 @app.get("/") async def root(): return {"message": "Hello World"}
- 文件1.py
FastAPI支持的请求方式:
装饰器 | HTTP 方法 | 说明 | 使用注意事项 |
---|---|---|---|
@app.get() | GET | 处理 HTTP GET 请求,获取资源的信息或数据。 | 应该是幂等的,不应该对服务器状态进行修改。不要包含对资源的修改操作。 |
@app.post() | POST | 处理 HTTP POST 请求,创建新资源或提交数据。 | POST 请求应该包含一个请求体,应避免包含敏感信息。 |
@app.put() | PUT | 处理 HTTP PUT 请求,更新已存在的资源或创建指定标识的资源。 | PUT 请求应该包含一个完整的资源表示,用于替换原始资源。 |
@app.patch() | PATCH | 处理 HTTP PATCH 请求,部分更新已存在的资源的内容。 | PATCH 请求应该包含一个用于指定需要更新的部分资源内容的请求体。应避免更新资源的标识或其他关键信息。 |
@app.delete() | DELETE | 处理 HTTP DELETE 请求,删除指定资源。 | DELETE 请求应该谨慎使用,应使用权限验证和确认机制。 |
@app.options() | OPTIONS | 处理 HTTP OPTIONS 请求,获取目标资源支持的通信选项。 | OPTIONS 请求通常由浏览器在跨域请求时发送,一般不需要直接处理。 |
@app.head() | HEAD | 处理 HTTP HEAD 请求,仅返回响应头信息,不返回实际内容。获取资源的响应头信息,而不获取实际的资源内容。 | HEAD 请求与 GET 请求类似,但不返回实际的资源内容。 |
@app.trace() | TRACE | 处理 HTTP TRACE 请求,追踪请求在传输链路上的路径,用于调试。 | TRACE 请求通常用于调试和诊断网络问题,一般不在业务逻辑中直接使用。 |
async关键字:使用async可以使函数能够处理异步操作,例如异步的数据库查询、IO 操作等,以提高性能和并发能力。这样的函数可以通过await关键字调用其他异步函数,或者执行需要等待的异步操作,而不会阻塞整个应用程序的执行。
FastAPI有个优势是可以自动生成API文档,使用http://127.0.0.1:8000/docs
即可访问(这里127.0.0.1运行后服务端地址,8000是运行端口)
FastAPI()方法可以通过lifepan参数来管理程序启停处理(类似老版本的:@app.on_event("startup") @app.on_event("shutdown")装饰器来定义启动和停止相关的操作方法,此种方式新版本不推荐使用了)
# 对应历史版本格式是
#@app.on_event("startup")
#async def startup_event():
# log.info("app start")
#
#@app.on_event("shutdown")
#async def shutdown_event():
# log.info("app shutdown")
@asynccontextmanager
async def lifespan(app:FastAPI):
log.info("app start")
yield
log.info("app shutdown")
app = FastAPI(lifespan=lifespan)
Uvicorn
Uvicorn是一个为Python设计的ASGI(Asynchronous Server Gateway Interface 异步服务器网关接口)服务器,用于构建异步Web服务。它基于 asyncio库,支持高性能的异步请求处理,适用于各种类型的 Web 应用程序。
Uvicorn安装:pip install Uvicorn
Uvicorn既可以从命令行启动,也可以通过Python代码进行启动。
-
从命令行启动程序
uvicorn main:app --reload
这里的:
- main是要启动的程序的Python文件名(样例中对应的mian.py文件)
- app是在mian.py中创建的FastAPI应用程序实例。
- --reload让服务器在代码更新后重新启动,仅在开发时使用该选项。
uvicorn更多参数如下:
参数 作用 示例 --host 指定绑定的主机地址 --host 127.0.0.1 --port 指定端口号 --port 8000 --workers 指定工作进程数 --workers 4 --reload 启用自动重载,在开发时自动检测文件变动并重启服务器 --reload --log-level 日志等级(info、debug、error) --log-level debug --ssl-keyfile 支持通过SSL加密来提供安全的通信。使用本参数指定SSL密钥文件路径 --ssl-keyfile ./path/to/key.pem --ssl-certfile 支持通过SSL加密来提供安全的通信。使用本参数指定SSL证书文件路径 --ssl-certfile ./path/to/cert.pem --backlog 设置连接请求的最大等待队列数 --backlog 2048 --limit-max-requests 限制单个进程在重启前可处理的最大请求数 --limit-max-requests 1000 -
通过Python代码中启动Uvicoren
from fastapi import FastAPI import uvicorn app = FastAPI(lifespan=lifespan) @app.get("/") async def root(): return {"message": "Hello World"} if __name__ == "__main__" : uvicorn.run("main:app", host="127.0.0.1", port=5000, log_level="info")