Python项目使用FastAPI和Uvicorn打造高性能API服务

FastAPI

FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建基于 Python 的 API。它具有简单易用的特性,同时也提供了高度自动化的文档生成功能,使得开发者可以更加高效地构建和部署 API 服务。功能强大、易于使用且高性能的 Web 框架,适用于构建各种规模的 API 服务。它的简洁语法、自动生成文档和异步支持等特性使得开发 API 更加轻松和愉快。

FastAPI安装:pip install fastapi

  1. 可以在主文件中定义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}
    
  2. 也可以多个文件中定义不同的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"}
      

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代码进行启动。

  1. 从命令行启动程序

    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
  2. 通过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")
    
posted @ 2024-11-26 17:10  小拙  阅读(1224)  评论(0)    收藏  举报