From 80cb879bc8089afd76dafe1dab9d7a3b707ac04f Mon Sep 17 00:00:00 2001 From: k23223 <57606136+k23223@users.noreply.github.com> Date: Mon, 4 Sep 2023 10:41:12 +0800 Subject: [PATCH] feat: Add FastAPI (#422) --- README.md | 2 + assets/fastapi.svg | 3 + docs/fastapi.md | 178 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 183 insertions(+) create mode 100644 assets/fastapi.svg create mode 100644 docs/fastapi.md diff --git a/README.md b/README.md index 6ce3a32..861f377 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ Quick Reference [Django](./docs/django.md) [FFmpeg](./docs/ffmpeg.md) [Flask](./docs/flask.md) +[FastAPI](./docs/fastapi.md) [Flutter](./docs/flutter.md) [Gitlab CI/CD](./docs/gitlab-ci.md) [LaTeX](./docs/latex.md) @@ -47,6 +48,7 @@ Quick Reference [Dockerfile](./docs/dockerfile.md) [Django](./docs/django.md) [Flask](./docs/flask.md) +[FastAPI](./docs/fastapi.md) [Flutter](./docs/flutter.md) [Golang](./docs/golang.md) [GraphQL](./docs/graphql.md) diff --git a/assets/fastapi.svg b/assets/fastapi.svg new file mode 100644 index 0000000..11cb3d5 --- /dev/null +++ b/assets/fastapi.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/fastapi.md b/docs/fastapi.md new file mode 100644 index 0000000..3c7e7e8 --- /dev/null +++ b/docs/fastapi.md @@ -0,0 +1,178 @@ +FastAPI备忘清单 +=== + +FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。 + +入门 +--- + +### 最小程序 + +下面代码会直接启动http服务,也可以使用uvicorn main:app --reload + +```python +from fastapi import FastAPI +import uvicorn + +app = FastAPI() + +# http://127.0.0.1:8000/ +@app.get("/") +async def root(): + return {"message": "Hello World"} + +if __name__ == '__main__': + uvicorn.run(app='main:app', reload=True) +``` + +### 查询参数 + + +带默认值的查询参数 + +```python +fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}] +@app.get("/items/") +async def read_item(skip: int = 0, limit: int = 10): + return fake_items_db[skip: skip + limit] +``` + +可选查询参数 + +```python +from typing import Union +@app.get("/items/{item_id}") +async def read_item(item_id: str, q: Union[str, None] = None): + if q: + return {"item_id": item_id, "q": q} + return {"item_id": item_id} +``` + +多路径多查询参数 or + +```python +@app.get("/users/{user_id}/items/{item_id}") +async def read_user_item( + user_id: int, item_id: str, q: Union[str, None] = None, short: bool = False +): + item = {"item_id": item_id, "owner_id": user_id} + if q: + item.update({"q": q}) + if not short: + item.update( + {"description": "This is an amazing item that has a long description"} + ) + return item +``` + +必需查询参数 + +```python +@app.get("/items/{item_id}") +async def read_user_item(item_id: str, needy: str): + item = {"item_id": item_id, "needy": needy} + return item +``` + +### 路径参数 + +最基本的路径参数 + +```python +@app.get("/items/{item_id}") +async def read_item(item_id): + return {"item_id": item_id} # item_id自定义 +``` + +多个路径参数 + +```python +@app.get("/items/{item_id}/{user_id}") +async def read_item(item_id, user_id): + return {"item_id": item_id, "user_id": user_id} +``` + +有类型的路径参数 + +```python +@app.get("/items/{item_id}") +async def read_item(item_id: int): + return {"item_id": item_id} +``` + +文件路径参数 + +```python +@app.get("/file/{file_path:path}") +async def read_item(file_path): + return {"file_path": file_path} +``` + +### 请求体 + +```python +from pydantic import BaseModel +from typing import Union +class Item(BaseModel): + name: str = '小明' + description: Union[str, None] = None + price: float + tax: Union[float, None] = None +@app.post("/items/") +async def create_item(item: Item): + print(item.name) + return item +``` + +#### 调用 + +```bash +curl -X 'POST' \ + 'http://127.0.0.1:8000/items/' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "name": "小明", + "description": "string", + "price": 0, + "tax": 0 +}' +``` + +### 查询参数和字符串校验 + +```python +from fastapi import Query +@app.get("/items/") +async def read_items(q: Union[str, None] = Query(default=None, max_length=50)): + results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} + if q: + results.update({"q": q}) + return results +``` + +#### 参数列表 + +| 参数 | 含义 | 类型 | +| ---------- | ------------ | ------------- | +| default | 默认值 | 任意类型或... | +| max_length | 最大长度 | int | +| min_length | 最小长度 | int | +| pattern | 正则匹配 | string | +| alias | 别名参数 | string | +| deprecated | 准备弃用参数 | bool | + +多个相同的查询参数 + +```python +@app.get("/items/") +async def read_items(q: Union[List[str], None] = Query(default=None)): + query_items = {"q": q} + return query_items +``` + +参考 +--- + +- [Python 备忘清单](./python.md) _(jaywcjlove.github.io)_ +- [FastAPI 官方文档](https://fastapi.tiangolo.com/zh/tutorial/) _(fastapi.tiangolo.com)_