路径参数 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())