返回顶部
首页 > 资讯 > 后端开发 > Python >FastAPI--参数提交Request Body(3)
  • 933
分享到

FastAPI--参数提交Request Body(3)

参数FastAPIBody 2023-01-31 08:01:12 933人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

一般对于Request Body不会通过get提交,对于get提交的参数一般称为是查询参数。所以,如果是通过POTS,PUT等方式提交的参数信息,我们一般是放到Request Body来提交到我们的后端。对于如何接收和校验请求体,Fasta

一般对于Request Body不会通过get提交,对于get提交的参数一般称为是查询参数。所以,如果是通过POTS,PUT等方式提交的参数信息,我们一般是放到Request Body来提交到我们的后端

对于如何接收和校验请求体,Fastapi提供的形式是使用:from pydantic import BaseModel

示例如下:

import uvicorn
from fastapi import FastAPI
from pydantic import BaseModel

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

app = FastAPI()

@app.post("/items/")
async def create_item(item: Item):
    return item

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

在上面的模型中,如果提交的Item它必须是怎么样的一个格式,比如name是必选字段,description是可选且默认为None, price是必选,且需要是float类型的,tax是可须且默认为None。

那客户端如何提交上面那些参数呐?

尝试提交参数什么都不写的情况下:

Http://127.0.0.1:8000/items/

1.png

使用JSON格式提交参数的情况下:

{
    "name":"Foo",
    "description":"An openfdsf",
    "price":45.4,
    "tax":3.5
}

 

1.png

故意提交错误参数格式请求:

{
    "name":"Foo",
    "description":"An openfdsf",
    "price":"45abc",
    "tax":3.5
}

 

1.png

Request Body 和 Query 和 Path的混合

在设计一些API过程中难免的可能也会需要综合遇到上述的一些混搭的组合,需要同时多个参数的提交和获取

那么我们通常接收这次参数的话一般怎么接收呐?

示例代码如:

import uvicorn
from fastapi import FastAPI, Path
from pydantic import BaseModel

app = FastAPI()

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

@app.put("/items/{item_id}")
async def update_item(
        *,
        item_id: int = Path(..., title="The ID of the item to get", ge=0, le=1000),
        q: str = None,
        item: Item = None,
):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    if item:
        results.update({"item": item})
    return results

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

通过之前的学习,其实也很简单道理也还是一样,如上的示例请求的话:

 

url:

http://127.0.0.1:8000/items/1000?q=xiao

参数:

{
    "name":"Foo",
    "description":"An openfdsf",
    "price": 45.4,
    "tax":3.5
}

效果如下:

1.png

多个Request Body的提交

更复杂的业务其实会存在多体的Boay的提交,之前做的商城下单里面,客户端有可能就会同时提交多个实体的对象信息到后端,如订单实体,地址实体,商品信息实体等。

那么在Fastapi如何接受多个Body实体呐?通常以前的话,在bottle,通常直接的request.body 或 request.json就可以获取客户端部提交的信息了。

在Fastapi假设客户端提交的参数是这样的形式:

{
    "item": {
        "name": "Foo",
        "description": "The pretender",
        "price": 42.0,
        "tax": 3.2
    },
    "user": {
        "username": "dave",
        "full_name": "Dave Grohl"
    }
}

 

那如何的接收处理呐?

import uvicorn
from fastapi import FastAPI, Path
from pydantic import BaseModel

app = FastAPI()

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

class User(BaseModel):
    username: str
    full_name: str = None

@app.put("/items/{item_id}")
async def update_item(*, item_id: int, item: Item, user: User):
    results = {"item_id": item_id, "item": item, "user": user}
    return results

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

这种情况,其实就是客户端提交多个实体对象。那可以定义多个模型对象即可。fastapi它会自动帮你处理提取信息。

http://127.0.0.1:8000/items/1000

 

1.png

 

如果另外再假设:

在Fastapi假设客户端提交的参数是这样的形式:

{
    "item": {
        "name": "Foo",
        "description": "The pretender",
        "price": 42.0,
        "tax": 3.2
    },
    "user": {
        "username": "dave",
        "full_name": "Dave Grohl"
    },
    "importance": 5
}

其实这种可能也不是不存在滴,那如何的读取解析importance参数呐?既然参数有Query 和 Path,当然也会有 Body 。

import uvicorn
from fastapi import Body, FastAPI
from pydantic import BaseModel

app = FastAPI()

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

class User(BaseModel):
    username: str
    full_name: str = None

@app.put("/items/{item_id}")
async def update_item(
        *, item_id: int, item: Item, user: User, importance: int = Body(..., gt=0)
):
    results = {"item_id": item_id, "item": item, "user": user, "importance": importance}
    return results

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

上面的代码中我们引入了Body 并且在importance: int = Body(...)进行处理和提取:

1.png

 

如果另外再假设,客户端提交的是一个单体对象内嵌的话,我们需要怎么处理?:

{
    "item": {
        "name": "Foo",
        "description": "The pretender",
        "price": 42.0,
        "tax": 3.2
    }
}

FastAPI提供了一个:

item: Item = Body(..., embed=True) 具体如下:
import uvicorn
from fastapi import Body, FastAPI
from pydantic import BaseModel

app = FastAPI()


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

@app.put("/items/{item_id}")
async def update_item(*, item_id: int, item: Item = Body(..., embed=True)):
    results = {"item_id": item_id, "item": item}
    return results

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

 

请求示例如:

1.png

 

 

如果另外再假设,客户端提交一个更复杂的嵌套模型的话,怎么办?麻蛋的 肯定也是会有这样的情况滴! 嵌套里面有列表有实体。比如:

{
    "name": "Foo",
    "description": "The pretender",
    "price": 42.0,
    "tax": 3.2,
    "tags": ["rock", "metal", "bar"],
    "image": {
        "url": "http://example.com/baz.jpg",
        "name": "The Foo live"
    }
}

这时候,我们就需要所谓的子内嵌啦:

import uvicorn
from typing import Set

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Image(BaseModel):
    url: str
    name: str

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None
    tags: Set[str] = []
    image: Image = None

@app.put("/items/{item_id}")
async def update_item(*, item_id: int, item: Item):
    results = {"item_id": item_id, "item": item}
    return results

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

如上代码,Item里面包含了Image,也包含了,tags类型的列表定义。

1.png

 

 

MMP更深层的嵌套也是可以定义的如:

{
    "name":"Foo",
    "description":"The pretender",
    "price":42,
    "items":[
        {
            "name":"Foo",
            "description":"The pretender",
            "price":42,
            "tax":3.2,
            "tags":[
                "rock",
                "metal",
                "bar"
            ],
            "image":{
                "url":"http://example.com/baz.jpg",
                "name":"The Foo live"
            }
        },
        {
            "name":"Foo2",
            "description":"The 2",
            "price":422,
            "tax":3.2,
            "tags":[
                "rock",
                "metal",
                "bar"
            ],
            "image":{
                "url":"http://example.com/baz.jpg",
                "name":"The Foo live"
            }
        }
    ]
}

对应的解析为:

import uvicorn

from fastapi import FastAPI
from pydantic import BaseModel
from typing import List, Set

app = FastAPI()

class Image(BaseModel):
    url: str
    name: str

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None
    tags: Set[str] = []
    # images: List[Image] = None
    image: Image = None

class Offer(BaseModel):
    name: str
    description: str = None
    price: float
    items: List[Item]

@app.post("/offers/")
async def create_offer(*, offer: Offer):
    return offer

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

 

请求url

http://127.0.0.1:8000/offers

 

1.png

Request Body的Field

Field字段的意思其实就是类似上面Query, Path,也同样给Body内的字段的信息添加相关的校验。

也就是说。通过Field来规范提交的Body参数信息。比如:

import uvicorn

from fastapi import Body, FastAPI
from pydantic import BaseModel, Field

app = FastAPI()

class Item(BaseModel):
    name: str
    description: str = Field(None, title="标题啊", description="错误提示文字啊", max_length=30)
    price: float = Field(..., gt=0, description="错误提示文字啊")
    tax: float = None

@app.put("/items/{item_id}")
async def update_item(*, item_id: int, item: Item = Body(..., embed=True)):
    results = {"item_id": item_id, "item": item}
    return results

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

 

上面的意思就是和之前定义参数校验其实一样

正常情况:

{
    "item":{
        "name": "Foo",
        "description": "The pretender",
        "price": 42.0,
        "tax": 3.2

    }
}

 

 1.png

 

 

异常情况:

{
    "item":{
        "name": "Foo",
        "description": "The pretender sssssssssssssssss",
        "price": 42.0,
        "tax": 3.2

    }
}

1.png

 

 

其他数据类型的校验

对于数据格式的校验,通常,我们不止于

  • int

  • float

  • str

  • bool

但是提交参数不止于上述的几种格式,有时候比如是对手机号码的校验,有些时候是时间类型的校验等

其他类型:

其他数据类型¶ 以下是您可以使用的一些其他数据类型(来自官方文档):

  • UUID:

    • 一个标准的“通用唯一标识符”,在许多数据库和系统中常见于ID。

    • 在请求和答复中,将表示为str.

  • datetime.datetime:

    • 一只pythondatetime.datetime.

    • 在请求和答复中,将表示为str采用ISO 8601格式,如:2008-09-15T15:53:00+05:00.

  • datetime.date:

    • Pythondatetime.date.

    • 在请求和答复中,将表示为str采用ISO 8601格式,如:2008-09-15.

  • datetime.time:

    • 一只Pythondatetime.time.

    • 在请求和答复中,将表示为str采用ISO 8601格式,如:14:23:55.003.

  • datetime.timedelta:

    • 一只Pythondatetime.timedelta.

    • 在请求和答复中,将表示为float总秒数。

    • Pydantic还允许将其表示为“ISO 8601时间差异编码”,有关更多信息,请参阅文档。.

  • frozenset:

    • 在请求和答复中,将其视为set:

    • 在请求中,将读取列表,消除重复,并将其转换为set.

    • 在答复中,set将转换为list.

    • 生成的架构将指定set值是唯一的(使用JSONSchema的uniqueItems).

  • bytes:

    • 标准Pythonbytes.

    • 在请求和答复中将被视为str.

    • 生成的架构将指定它是str带着binary“格式”。

  • Decimal:

    • 标准PythonDecimal.

    • 在请求和响应中,处理方式与float.

所以我还可以使用其他类型来校验:

import uvicorn

from datetime import datetime, time, timedelta
from uuid import UUID

from fastapi import Body, FastAPI

app = FastAPI()


@app.put("/items/{item_id}")
async def read_items(
        item_id: UUID,
        start_datetime: datetime = Body(None),
        end_datetime: datetime = Body(None),
        repeat_at: time = Body(None),
        process_after: timedelta = Body(None),
):
    start_process = start_datetime + process_after
    duration = end_datetime - start_process
    return {
        "item_id": item_id,
        "start_datetime": start_datetime,
        "end_datetime": end_datetime,
        "repeat_at": repeat_at,
        "process_after": process_after,
        "start_process": start_process,
        "duration": duration,
    }

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)



本文参考链接:

http://www.zyiz.net/tech/detail-119883.html

 


--结束END--

本文标题: FastAPI--参数提交Request Body(3)

本文链接: https://lsjlt.com/news/193716.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • FastAPI--参数提交Request Body(3)
    一般对于Request Body不会通过get提交,对于get提交的参数一般称为是查询参数。所以,如果是通过POTS,PUT等方式提交的参数信息,我们一般是放到Request Body来提交到我们的后端。对于如何接收和校验请求体,FastA...
    99+
    2023-01-31
    参数 FastAPI Body
  • Springboot怎么使用filter对request body参数进行校验
    这篇文章主要为大家展示了“Springboot怎么使用filter对request body参数进行校验”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Springboot怎么使用fil...
    99+
    2023-06-29
  • SpringBoot如何配置获取request中body的json格式参数
    目录背景获取请求中的参数(非json格式参数)获取方法结论获取POST请求json格式的参数经过检索推荐方法(参看后边完整方法)实现方法使用背景 最近开发项目,因为有第三方调用我们的...
    99+
    2024-04-02
  • Spring MVC url提交参数和获取参数
    普通URL提交参数该格式url为:url.do?param1=mahc&param2=8888.00需要在上文中的HelloController对象添加方法如下: @RequestMapping("/param") ...
    99+
    2023-05-31
    spring mvc url
  • flink1.12 内存和提交参数
    在使用yarn cluster模式提交flink的任务时候,往往会涉及到很多内存参数的配置 例如下面的提交命令: flink run -d -m yarn-cluster  -yjm 512 -ytm 5028  -yD jobmanag...
    99+
    2017-09-20
    flink1.12 内存和提交参数
  • php提交参数乱码怎么办
    本教程操作环境:windows7系统、PHP8.1版、Dell G3电脑。php提交参数乱码怎么办?问题描述:PHP $_POST提交中文乱码html: <form action="__APP__/ShoppingCart/...
    99+
    2024-04-02
  • httpclient使用post提交表单参数
    要使用HttpClient进行POST请求并提交表单参数,您需要按照以下步骤进行操作:1. 创建一个HttpClient实例:```...
    99+
    2023-08-08
    httpclient
  • php提交参数乱码如何解决
    这篇文章主要介绍“php提交参数乱码如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php提交参数乱码如何解决”文章能帮助大家解决问题。php提交参数乱码的解决办法:1、打开相应的PHP文件;...
    99+
    2023-07-04
  • 【MYSQL】两阶段提交及相关参数介绍
        由于Mysql的事务日志包含二进制日志和存储引擎日志,当发生崩溃恢复时,MySQL主节点通过redo log进行恢复,而在主从复制的环境下,slaver节点是...
    99+
    2024-04-02
  • C#中的multipart/form-data提交文件和参数
    目录C# multipart/form-data提交文件和参数C# POST multipart/form-data案例C# multipart/form-data提交文件和参数 ...
    99+
    2024-04-02
  • Python requests库参数提交的注意事项总结
    字典与json字符串区别 # python 中的字典格式,是dict类型 {'a': 'sd'} 如果声明a = {"a": "sd"},它仍是字典,不过python会默认将双引...
    99+
    2024-04-02
  • spark大数据任务提交参数的优化记录分析
    目录起因分析环境参数问题所在优化结果起因 新接触一个spark集群,明明集群资源(core,内存)还有剩余,但是提交的任务却申请不到资源。 分析 环境 spark 2.2.0 基于...
    99+
    2023-05-20
    spark任务提交参数优化 spark大数据参数优化
  • 怎么解决Ajax提交参数的值中带有html标签不能提交成功的问题
    这篇文章主要介绍“怎么解决Ajax提交参数的值中带有html标签不能提交成功的问题”,在日常操作中,相信很多人在怎么解决Ajax提交参数的值中带有html标签不能提交成功的问题问题上存在疑惑,小编查阅了各式...
    99+
    2024-04-02
  • ajax提交到servelt获取参数有乱码如何解决
    本篇内容主要讲解“ajax提交到servelt获取参数有乱码如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ajax提交到servelt获取参数有乱码如何...
    99+
    2024-04-02
  • ajax如何解决参数过长无法提交成功的问题
    这篇文章主要介绍了ajax如何解决参数过长无法提交成功的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。查了很多资料都说,get方法的参数...
    99+
    2024-04-02
  • 如何解决asp.net中mvc使用ajax提交参数的匹配问题
    本篇文章为大家展示了如何解决asp.net中mvc使用ajax提交参数的匹配问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 想到在...
    99+
    2024-04-02
  • 有哪些常见form提交时传递额外的参数的方法
    本篇内容主要讲解“有哪些常见form提交时传递额外的参数的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“有哪些常见form提交时传递额外的参数的方法”吧!在进行表单提交时,会遇到在提交前增加...
    99+
    2023-06-08
  • 在Python中使用requests库提交参数时需要注意哪些事项
    在Python中使用requests库提交参数时需要注意哪些事项?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。字典与json字符串区别# python...
    99+
    2023-06-14
  • 在SpringMVC中使用bean如何实现接收form表单提交的参数
    今天就跟大家聊聊有关在SpringMVC中使用bean如何实现接收form表单提交的参数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。使用bean来接收form表单提交的参数时,po...
    99+
    2023-05-31
    springmvc form bean
  • 面试官问我为啥B+树一般都不超过3层?3层B+树能存多少数据?redo log与binlog的两阶段提交?
    我今天逛了一下CSDN,又发现了一条显眼的数据,大概是说3层B+树足以容纳2000w条数据。我当时就蒙了,3层对2000w,心想这B+树也太厉害了吧,由此勾起了我求知的欲望,我一定要搞明白他这2000w是怎么来的。 重中之重 MySQL的执...
    99+
    2023-09-02
    mysql 数据库 面试 b树
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作