Fastsapi的小疑问

1. Fastapi中的get和post区别是什么?

答:get参数传输暴露在外,post隐式传输

GET参数获取:获取一个URL后面带?param1=1&param2=2这种形式。

特点:URL上直接编辑传输,方便快捷,但是信息暴露在外不安全
案例:如GET代码1GET代码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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值