FastAPI基础:3.请求参数
FastAPI基础:3.请求参数

FastAPI基础:3.请求参数

路径参数 Path

ps: 通常一个url中,可变的那部分数据;即访问者传递的时候在url中指定

需要{参数} 和 视图中的参数进行映射,如果没有就是普通路径

@app.get("/get/{id}")  # {id} 为路径参数,由访问者决定最终访问的路由 host:port/get/1  or host:port/get/777
async def get_id(id: int): # 决定路由参数的类型 ,自动处理成int 类型,如果能成功的化, 此处参数名称需要和 路径参数对应
    return id

# 更多定义 路径参数 Path
"""
default 默认值 等价于 id: int = 10
gt:大于(greater than)
ge:大于等于(greater than or equal)
lt:小于(less than)
le:小于等于(less than or equal)
incluede_in_schema:显示接口文档
example:显示接口文档中
max_length:长度
regx:正则表达式
"""
from fastapi import Path
@app.get("/get/path/{id}") 
async def get_pid(id: int = Path(default=10, description="ad", gt=11, example=5)):
    return id

查询参数 Query

ps: 通常的url形式为 127.0.0.1:8000/query?name=777&age=16 ?后面既是参数的开始 &为多个参数的链接 如果无路径参数映射,无Body、Form标识 则默认是 查询参数

"""
查询参数:即url - 127.0.0.1:8000/query?name=777&age=16
"""
@app.get("/query")
async def query(name: str, age: int = 18):
    return name, age

"""
更多定义,参数和Path类似
"""
from fastapi import Query

@app.get("/query1")
async def query1(name: str = Query("777", alias="别名 7y", title="我的title")):
    return name

请求体参数 Body

ps: request header中 content-type:application/json;

如果参数是 Dict类型或者 Pydnatic Model 类型则被自动处理成请求体参数

"""
Body 参数 -请求体 Json
Content-Type: application/json  request header中指定
"""
from typing import Dict
# 1. 使用字典 不常用
@app.post("/json")
async def json_data(info: Dict[str, str] ={}):
    return info

# 2. Body 可用参数和Path 类似
from fastapi import Body
@app.post("/body")
async def body(name: str = Body(max_length=4), age: int=Body()):
    return name,age

# 3. pydantic模型
from pydantic import BaseModel, Field
from typing import Optional

class Info(BaseModel):
    name: Optional[str]
    # 可以通过Field来定义更多
    age: int = Field(gt=18)

"""
{"name":"xx", "age":18} 
"""
@app.post("/pydantic")
async def pydantic(info: Info):
    return info

# 4. 配合body
"""
将body参数 loves 加到json 体 info 中
"""
{
    "info": {"name":"xxx","age":18},
    "loves":"xxx"
}

@app.post("/pb")
async def pb(info: Info, loves: str = Body()):
    return info

表单参数 Form (用的较少)

ps: request header Content-Type: application/x-www-form-urlencoded

"""
表单参数 Form 参数字段和Path类似
pip install python-multipart
default = None 非必填

request header Content-Type: application/x-www-form-urlencoded
"""
from fastapi import Form

@app.post("/login/")
async def login(username: str = Form(default=None), password: str = Form(max_length=20)):
    return {"username": username}

上传文件(Form)

不包含文件时,表单数据一般用 application/x-www-form-urlencoded「媒体类型」编码。 但表单包含文件时,编码为 multipart/form-data。

"""
上传文件
"""
from fastapi import UploadFile, File

"""
UploadFile 的属性如下:

filename:上传文件名字符串(str),例如, myimage.jpg;
content_type:内容类型(MIME 类型 / 媒体类型)字符串(str),例如,image/jpeg;
file: SpooledTemporaryFile( file-like 对象)。其实就是 Python文件,可直接传递给其他预期 file-like 对象的函数或支持库。
UploadFile 支持以下 async 方法,(使用内部 SpooledTemporaryFile)可调用相应的文件方法。

write(data):把 data (str 或 bytes)写入文件;
read(size):按指定数量的字节或字符(size (int))读取文件内容;
seek(offset):移动至文件 offset (int)字节处的位置;
例如,await myfile.seek(0) 移动到文件开头;
执行 await myfile.read() 后,需再次读取已读取内容时,这种方法特别好用;
close():关闭文件。
因为上述方法都是 async 方法,要搭配「await」使用。
"""

# file 为参数名
@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile):
    return {"filename": file.filename}

# 增强定义 和 Path类似
@app.post("/upload")
async def upload(file: UploadFile = File(description="参数名是excel")):
    return file.filename

混合(路径 + 查询 + 表单 + 文件上传)

"""
请求体 同时只能使用一种 即 json 和 form 只能同时存在一种
"""
from typing import List

@app.post("/example/{name}/123/{age}")
async def example(name: str, loves: str, addr: str = Form(), pooto: List[UploadFile] = File()):
    return name, loves, addr

图片image.png

Requests 请求

from requests import post

# 路径参数
path_name = "777"
# 查询参数
params = {"loves": "my loves"}

# 表单参数
data = {"addr": "wode shuju"}

# 文件参数 上传多个文件
file_var = [
    ('pooto', open('main.py', 'rb')),
    ('pooto', open('demo.py', 'rb'))
]
# 上传单个文件
file_var = {'pooto': open('demo.py', 'rb')}

res = post(url="http://localhost:8000/example/" + path_name + "/123/{age}",
           params=params, data=data, files=file_var)
print(res.json())

发表回复

您的电子邮箱地址不会被公开。