1. Fastapi中的get和post区别是什么?
答:get参数传输暴露在外,post隐式传输
GET参数获取:获取一个URL后面带
?param1=1¶m2=2
这种形式。特点:URL上直接编辑传输,方便快捷,但是信息暴露在外不安全。
案例:如GET代码1
和GET代码2
POST参数获取:需要编写客户端demo,通过demo把参数传输进去。
特点:安全可靠,但是繁琐
案例:如POST代码1
GET代码1
(匹配):
匹配的模板就是:http://127.0.0.1:8080/name=值1/age=值2
,对应的写法是:
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/name={n}/age={ag}")
async def server1(n, ag):
return {
"name": n,
"age": ag,
}
if __name__ == '__main__':
uvicorn.run('main:app', port=8080, host='127.0.0.1', reload=True, proxy_headers=True)
GET代码2
(访问):
访问:http://127.0.0.1:8080/get/?name=值1&age=值2
,对应的写法是:
from fastapi import FastAPI, Query
import uvicorn
app = FastAPI()
@app.get("/get/")
async def server2(name=Query(None), age=Query(None)):
return {
"name": name,
"age": age,
}
if __name__ == '__main__':
uvicorn.run('main:app', port=8080, host='127.0.0.1', reload=True, proxy_headers=True)
注意:这Query(None)
自动解析URL,使对应参数进行匹配,如果没有匹配,使用默认值None,更多使用说明参考官方Fastapi官网
POST代码1
服务端完整demo:
# -*- coding: utf-8 -*-
# author:laidefa
# 载入包
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.get("/")
async def root():
return 'Hello World!'
@app.post("/bianbian")
async def fcao_predict(item: Item):
item_dict = item.dict()
if item.tax:
price_with_tax = item.price + item.tax
item_dict.update({"price_with_tax": price_with_tax})
return item_dict
if __name__ == '__main__':
uvicorn.run('main:app', port=8080, host='127.0.0.1', reload=True, proxy_headers=True)
客户端demo
# -*- coding: utf-8 -*-
# author:laidefa
# 载入包
import requests
import json
import time
params={
"name": "bianbian",
"description": "An optional description",
"price": 999,
"tax": 3.5
}
url='http://127.0.0.1:8080/bianbian'
time1=time.time()
html = requests.post(url, json.dumps(params))
print('发送post数据请求成功!')
print('返回post结果如下:')
print(html.text)
time2=time.time()
print('总共耗时:' + str(time2 - time1) + 's')
客户端测试输出
注意:GET和POST都可以通过http://127.0.0.1:8080/docs
进行访问,在线上传数据,如下图。
2.Fastapi临时上传数据到Docker容器内的模板
import os, io, json, time
import uvicorn
import soundfile as sf
from fastapi import FastAPI, File,UploadFile
from paddlespeech.cli.asr.infer import ASRExecutor
app = FastAPI()
# 在运行的环境中创建文件夹,用于临时存放上传的文件
dir_list = ["static", "static/langid"]
for s_dir in dir_list:
if not os.path.exists(s_dir):
os.mkdir(s_dir)
# 使用完文件之后,清理当时暂存在内部的上传文件
def clear_wav(dir_base="/code"):
for fname in os.listdir(dir_base):
if fname.endswith('.wav'):
os.remove("/code/" + fname)
@app.post("/bianbian/")
async def create_file(file: UploadFile = File(...)):
# 读取数据
f_up = await file.read()
data, samplerate = sf.read(file=io.BytesIO(f_up), dtype='float32')
fname = str(time.time()).replace('.', '')
cur_fpath = os.path.join(dir_list[1], fname + '.wav')
# Docker容器内部保存数据
sf.write(cur_fpath, data, samplerate)
asr = ASRExecutor()
# 代码临时调用Docker容器内的临时数据进行使用
result = asr(audio_file=cur_fpath)
# 清除Docker容器内部的临时数据
clear_wav(dir_list[1])
return json.dumps({"code": 200, "msg": "识别成功!", "result": result}, ensure_ascii=False)
if __name__ == '__main__':
uvicorn.run('main:app', port=8080, host='0.0.0.0', reload=True, proxy_headers=True)
参考:
https://www.iotword.com/2888.html
路径参数获取与GET、POST参数获取
GET和POST请求参数接收以及验证
https://www.freesion.com/article/3542679645/
https://blog.csdn.net/u013421629/article/details/104892975