IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> fastapi 用户指南(路径参数、查询参数、请求体) -> 正文阅读

[Python知识库]fastapi 用户指南(路径参数、查询参数、请求体)


learn from https://fastapi.tiangolo.com/zh/tutorial/

1. 第一步

  • pip install fastapi[all]
from fastapi import FastAPI
my_app = FastAPI() # my_app 实例, 名字对应于 终端里的
@my_app.get("/")
async def root():
    return {"message" : "Hello World"}

  • http 操作:
    POST:创建数据。
    GET:读取数据。
    PUT:更新数据。
    DELETE:删除数据。

@my_app.get("/") 告诉 FastAPI 在它下方的函数负责处理如下访问请求:

  • 请求路径为 /
  • 使用 get 操作

函数可以返回一个 dictlist,像 strint 一样的单个值,等等。还可以返回 Pydantic 模型

1.1 小结

  • 导入 FastAPI
  • 创建一个 app 实例
  • 编写一个路径操作装饰器(如 @app.get("/")
  • 编写一个路径操作函数(如上面的 def root(): ...
  • 运行开发服务器(如 uvicorn main:app --reload

2. 路径参数

  • 函数参数,与 { } 内的名字,保持一致
@my_app.get("/items/{item_id}")
async def read_item(item_id):  # 要跟上面的 {} 内保持一致
    return {"itemid": item_id} # 返回字符串
  • 参数类型限制 : type,参数类型不匹配会报错
@my_app.get("/items/{item_id}")
async def read_item(item_id: int):  # 要跟上面的 {} 内保持一致
    return {"itemid": item_id} # 返回 int
  • 文档 http://127.0.0.1:8000/docshttp://127.0.0.1:8000/redoc

2.1 顺序很重要

@my_app.get("/users/me")
async def read_user_me():
    return {"user_id": "the current user"}


@my_app.get("/users/{user_id}")
async def read_user(user_id: str):
    return {"user_id": user_id}

在这里插入图片描述
如果上面,两个函数顺序反了,如下结果

在这里插入图片描述

2.2 预设值

  • 使用 Enum
from enum import Enum

app = FastAPI()


class ModelName(str, Enum): # 继承string, 枚举, 必须是字符串且是指定的枚举值
    alexnet = "alexnet"
    resnet = "resnet"
    lenet = "lenet"


@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):
    if model_name == ModelName.alexnet:
        return {"model_name": model_name, "message": "Deep Learning FTW!"}
    if model_name.value == "lenet":
        return {"model_name": model_name, "message": "LeCNN all the images"}
    return {"model_name": model_name, "message": "Have some residuals"}

可以使用 model_name.value 或通常来说 your_enum_member.value 来获取实际的值
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 包含路径的路径参数

  • 参数 { } 内 参数名:path :前后均没有空格,不加 :path 无法识别 带有/ 的路径参数
@app.get("/files/{file_path:path}")
async def read_file(file_path: str):
    return {"file_path": file_path}

3. 查询参数

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]
  • 使用 ? 开始,参数间使用 & 分割
    在这里插入图片描述
from typing import Optional
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: Optional[str] = None):
    if q:
        return {"item_id": item_id, "q": q}
    return {"item_id": item_id}

3.1 查询参数类型转换

from typing import Optional


@app.get("/items/{item_id}")
async def read_item(item_id: str, q: Optional[str] = None, short: bool = False):
    item = {"item_id" : item_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

输入 short=,后面是 1,True, true, yes, on, On, YES 任意变形体都是一样的效果,都是 true
在这里插入图片描述

  • 多个参数的顺序没影响,通过名字查找的
@app.get("/users/{user_id}/items/{item_id}")
async def read_user_item(
        item_id: str, user_id: int, q: Optional[str] = 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
  • item_id: str, user_id: int, 更换两个变量的位置,没有关系
    在这里插入图片描述

4. 请求体

请求体是客户端发送给 API 的数据
响应体是 API 发送给客户端的数据

使用 Pydantic 模型来声明请求体

from typing import Optional

from Pinyin2Hanzi import Item
from fastapi import FastAPI
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: Optional[str]=None
    price:float
    tax:Optional[float] = None

app = FastAPI()

@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item, q: Optional[str] = None):
    result = {"item_id": item_id, **item.dict()}
    if q:
        result.update({"q": q})
    return result

  • 还可以同时声明请求体、路径参数和查询参数。
    函数参数将依次按如下规则进行识别:
    1.如果在路径中也声明了该参数,它将被用作路径参数
    2.如果参数属于单一类型(比如 int、float、str、bool 等)它将被解释为查询参数
    3.如果参数的类型被声明为一个 Pydantic 模型,它将被解释为请求体
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-10-01 16:48:38  更:2021-10-01 16:51:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 16:17:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码