1. Fastapi中的get和post区别是什么?
答:get参数传输暴露在外,post隐式传输
GET参数获取:获取一个URL后面带
?param1=1¶m2=2这种形式。特点:URL上直接编辑传输,方便快捷,但是信息暴露在外不安全。
案例:如GET代码1和GET代码2POST参数获取:需要编写客户端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



















