FastAPI是一个现代、快速的Python Web框架,用于快速构建API。它基于 Pydantic 和 Starlette,使得代码更加简洁且易于绶护。
关键特性:
快速:可与 NodeJS 和 Go 并肩的极高性能(归功于 Starlette 和 Pydantic)。最快的 Python web 框架之一。
高效编码:提高功能开发速度约 200% 至 300%。
更少 bug:减少约 40% 的人为(开发者)导致错误。 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。 简单:设计的易于使用和学习,阅读文档的时间更短。 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。 健壮:生产可用级别的代码。还有自动生成的交互式文档。 标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema。
WSGI,Web服务器网关接口,是一种Web服务器网关接口,它是一个Web服务器(如Nginx)与Web应用(如Flask框架写的程序)通信的一种规范。当前运行在WSGI协议之上的Web框架有Bottle,Flask,Django。
ASGI:异步网关协议接口 ,一个介于网络协议服务和Python应用之间的标准接口,能够处理多种通用的协议类型,包括HTTP,HTTP2和WebSocket。
WSGI和ASGI的区别
WSGI是基于HTTP协议模式的,不支持WebSocket,而ASGI的诞生则是为了解决Python常用的WSGI不支持当前Web开发中的一些新的协议标准。
为什么要使用虚拟环境
虚拟环境的安装步骤:
python -m venv ml # ml就是虚拟环境名称
激活虚拟环境(每次用的时候要先激活):
source ml/bin/activate
需要安装所有的可选依赖及对应功能,包括了 uvicorn
,你可以将其用作运行代码的服务器。
pip install fastapi[all] -i https://pypi.douban.com/simple/
创建一个main.py:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return 'hello'
@app.get("/hello/{name}")
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)
访问文档:
请求路径指的是 URL 中从第一个 /
起的后半部分。所以,在一个这样的 URL 中:
http://example.com/demo
http://127.0.0.1/demo
那么,真正的请求路径(路由)是:/demo
在FastAPI中,路由的配置是通过: 装饰器 完成的。
在 HTTP 协议中,可以使用以下的其中几种请求方法 与每个路径进行通信。
通常使用:
POST
:创建数据。
GET
:读取数据。
PUT
:更新数据。
DELETE
:删除数据。
配置请求方法:
@app.post()
@app.put()
@app.delete()
url请求参数是通过url请求地址携带的:
https://www.liblib.art/modelinfo/689c717fbce24ec8940660c4dc53c626?from=feed
这些请求参数是键值对的集合,这些键值对位于 URL 的 ?
之后,并以 &
符号分隔。
from fastapi import FastAPI
app = FastAPI()
fake_demo_db = [{"demo_name": "Foo"}, {"demo_name": "Bar"}, {"demo_name": "Baz"}]
@app.get("/demo/")
def read_demo(skip: int = 0, limit: int = 10):
return fake_demo_db[skip : skip + limit]
URL请求参数不是路径的固定部分,因此它们可以是可选的,并且可以有默认值。
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/demo/{demo_id}")
async def read_demo(demo__id: str, q: Union[str, None] = None, short: bool = False):
demo = {"demo__id": demo__id}
if q:
item.update({"q": q})
if not short:
item.update(
{"description": "This is an amazing item that has a long description"}
)
return demo
Query是 FastAPI专门用来装饰请求参数的类,也可以提供校验。
@app.get("/demo/")
async def read_demo(q: Union[str, None] = Query(default=None, description="参数q可以传入字符串或者不传")):
query_demo = {"q": q}
return query_demo
description是 Query中的一个字段,用来描述该参数;
@app.get("/demo2/")
async def read_demo(q: Union[str, None] = Query(default=None, max_length=50, min_length=3)):
query_demo = {"q": q}
return query_demo
如果参数的类型是int,float就可以采用Query进行大小校验,或者范围校验。
@app.get("/demo/")
async def read_demo(id: int = Query(description="id参数必须是0到1000之间", gt=0, le=1000), q: str = Query(default=None)):
results = {"item_id": id}
if q:
results.update({"q": q})
return results
我们还可以使用 Query 去接收一组值。使用 List[str] 来接收一组值,里面的str可以根据需求随意调换。
from fastapi import FastAPI,Query
from typing import List, Union
app = FastAPI()
@app.get("/demo/")
async def read_demo(q: Union[List[str], None] = Query(default=None, description='q可以传入多个值')):
query_demos = {"q": q}
return query_demos
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="127.0.0.1", port=8000)
read_demo
接受一个名为 q
的参数,该参数通过 Query
进行了注解。Query
是 FastAPI 提供的一个函数,用于处理查询字符串中的参数。uvicorn.run(app, host="127.0.0.1", port=8000)
来运行 FastAPI 应用结果返回一个 JSON 响应: