FastAPI入门

648 阅读3分钟

准备

官网:fastapi.tiangolo.com/

Documentation: fastapi.tiangolo.com

Source Code: github.com/tiangolo/fa…

FastAPI 框架,高性能,易于学习,高效编码,生产可用

FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。

关键特性:

  • 快速:可与 NodeJSGo 比肩的极高性能(归功于 Starlette(网络工具包) 和 Pydantic(数据认证))。最快的 Python web 框架之一
  • 高效编码:提高功能开发速度约 200% 至 300%。*
  • 更少 bug:减少约 40% 的人为(开发者)导致错误。*
  • 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
  • 简单:设计的易于使用和学习,阅读文档的时间更短。
  • 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。
  • 健壮:生产可用级别的代码。还有自动生成的交互式文档。
  • 标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema

FastAPI可以用来做什么

  • 由Sebastian Ramirez 开发
  • 开发 web API
  • 开发网站
  • 做一个测试平台
  • 做一个持续集成工具
  • 生成文档

为什么要学习FastAPI

  • FastAPI的使用方法和设计参考了几十个python明星项目,博采众长,吸收各家精华
  • FastAPI和Fast一样简约
  • FastAPI非常新,并且基于python3.6的类型声明系统
  • 自动生成文档
  • 类型声明和数据检验
  • 内置身份认证
  • 性能强
  • 原生支持异步
  • 强大的依赖注入系统
  • GraphQL和Websocket支持

可选依赖

用于 Pydantic:

用于 Starlette:

  • requests - 使用 TestClient 时安装。
  • aiofiles - 使用 FileResponseStaticFiles 时安装。
  • jinja2 - 使用默认模板配置时安装。
  • python-multipart - 需要通过 request.form() 对表单进行「解析」时安装。
  • itsdangerous - 需要 SessionMiddleware 支持时安装。
  • pyyaml - 使用 Starlette 提供的 SchemaGenerator 时安装(有 FastAPI 你可能并不需要它)。
  • graphene - 需要 GraphQLApp 支持时安装。
  • ujson - 使用 UJSONResponse 时安装。

用于 FastAPI / Starlette:

  • uvicorn - 用于加载和运行你的应用程序的服务器。
  • orjson - 使用 ORJSONResponse 时安装。

你可以通过 pip install fastapi[all] 命令来安装以上所有依赖。

# python和pycharm安装
# anaconda创建虚拟环境
conda create -n fastapi python=3.9
# 进入/切换到指定名称的虚拟环境,如果不带任何参数,则默认回到全局环境base中。
# conda activate  <虚拟环境名称>
conda activate fastapi 
# 退出当前虚拟环境
conda deactivate

安装 FastAPI

# 安装所有的可选依赖及对应功能包括了 uvicorn,你可以将其用作运行代码的服务器
pip install fastapi[all]  # 安装所有组件
# 分开来安装
pip install fastapi
# 安装uvicorn来作为服务器:
pip install uvicorn[standard]

创建FastAPI项目并运行

from fastapi import FastAPI
​
app = FastAPI()
​
​
@app.get("/")
async def root():
    # 返回字符串
    # return "hello world"
    # 返回列表
    # return ["项目1", "项目2", "项目3"]
    # 返回json格式
    return {"message": "Hello World"}
​
​
@app.get("/hello/{name}")
async def say_hello(name: str):
    return {"message": f"Hello {name}"}
​
if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=8000)
​
# uvicorn main.py:app --reload