【python FastAPI】fastapi中如何限制输入参数,如何让docs更好看,如何自定义错误码json返回

news2024/11/15 19:54:08

原则:

  1. 输入输出都基于BaseModel
  2. 依靠JSONResponse制定返回错误的json信息
  3. 依靠装饰器中@app.post制定responses字典从而让docs文档更丰富

import uvicorn
from pydantic import BaseModel, Field
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from transformers import BlipProcessor, BlipForConditionalGeneration
from fastapi.responses import JSONResponse
from PIL import Image
import io
import base64

class UpscalerRequest(BaseModel):
    base64_image: str = Field(
        ...,
        title="Base64 Encoded Image",
        description="The base64-encoded image that you want to upscale."
    )
    outscale: float = Field(
        ...,
        ge=1.0,  # 大于等于1.0
        le=5.0,  # 小于等于5.0
        title="Upscale Factor",
        description="The scaling factor for image upscaling. Should be between 1.0 and 5.0."
    )


class UpscalerResponse(BaseModel):
    base64_image_out: str = Field(
        ...,
        title="Base64 Encoded Upscaled Image",
        description="The base64-encoded image after upscaling."
    )


class CustomErrorResponse:
    def __init__(self, description: str, error_code: int, detail: str):
        self.description = description
        self.error_code = error_code
        self.detail = detail

    def to_response_dict(self):
        return {
            "description": self.description,
            "content": {
                "application/json": {
                    "example": {"error_code": self.error_code, "detail": self.detail}
                }
            },
        }

    def __call__(self, extra_detail=None):
        if extra_detail is not None:
            self.detail = f"detail:{self.detail}, extra_detail:{extra_detail}"
        return JSONResponse(content={"error_code": self.error_code, "detail": self.detail}, status_code=self.error_code)


image_upscaler_CustomErrorResponse = CustomErrorResponse("超分执行错误", 501, "upscale error")


@app.post("/image_upscaler", response_model=UpscalerResponse, summary="Image Upscaler",
          responses={image_upscaler_CustomErrorResponse.error_code: image_upscaler_CustomErrorResponse.to_response_dict()})
def image_upscaler(request: UpscalerRequest):
    """
    Image Upscaler.

    Parameters:
    - `base64_image`: The base64-encoded image.
    - `outscale`: The scaling factor for image upscaling (between 1.0 and 5.0).

    Returns:
    - `output`: The base64-encoded upscaled image.

    Example:
    ```python
import requests
import base64
from PIL import Image
from io import BytesIO

# 1. 读取图像文件并转换为base64字符串
image_path = "car.png"
with open(image_path, "rb") as image_file:
    base64_image = base64.b64encode(image_file.read()).decode("utf-8")

# 2. 构造请求数据
outpainting_request = {
    "base64_image": base64_image,
    "outscale": 3,
}

# 3. 发送HTTP POST请求
api_url = "http://home.elvisiky.com:7862/image_upscaler"
response = requests.post(api_url, json=outpainting_request)

# 4. 处理响应
if response.status_code == 200:
    result_data = response.json()

    # 5. 保存base64编码的图像为文件
    detected_map_base64 = result_data["base64_image_out"]
    detected_map_image = Image.open(BytesIO(base64.b64decode(detected_map_base64)))
    detected_map_image.save("base64_image_out.png")

    print("图像保存成功!")
else:
    print(f"API调用失败,HTTP状态码:{response.status_code}")
    print(response.json())

    ```

    """
    try:
        base64_image = request.base64_image
        logging.info(f"image_upscaler, image length {len(base64_image)}")
        img = decode_image_from_base64(base64_image)
        img_cv2 = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
        output = enhance_image(img_cv2, outscale=request.outscale)
        if output is None:
            return image_upscaler_CustomErrorResponse()
        else:
            output_base64 = base64.b64encode(cv2.imencode('.png', output)[1]).decode('utf-8')
            return {"base64_image_out": output_base64}
    except Exception as e:
        return image_upscaler_CustomErrorResponse(str(e))


if __name__ == '__main__':
    uvicorn.run(f'{os.path.basename(__file__).split(".")[0]}:app',
                host='0.0.0.0',
                port=7862,
                reload=False,
                workers=1)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1243255.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Halcon学习笔记

目录 一.简介 一.简介 Halcon和OpenCV在工业应用中的区别: OpenCV的精度没Halcon高;OpenCV没有模板匹配,Halcon有,而且Halcon匹配的精度更高。

浅析基于智能音视频技术的城市重要场馆智能监控系统设计

了解旭帆科技的朋友都知道,旭帆科技一直都乐于和大家分享各类场景的视频解决方案,今天小编就基于智能音视频技术的城市重要场馆智能监控系统设计和大家探讨一下。 基于智能音视频技术的城市重要场馆智能监控系统设计,主要包含以下要素&#x…

老师检查家庭作业的作用

在教育体系中,老师检查家庭作业是一种常见的教学方式,旨在帮助学生巩固课堂所学知识,提高自学能力,以及培养良好的学习习惯。家庭作业是学生学习过程中不可或缺的一环,而老师对家庭作业的检查则起到了至关重要的作用。…

LoRaWAN 中国地区文件详细解读

目录 一、LoRaWAN简介 二、CN470-510地区参数分析 1.信道频率 2.支持功率 3.支持空速 4.最大负载大小 5.接受窗口参数 三、CN470_510默认参数 Lora LoraWAN教程 一、LoRaWAN简介 LoraWAN是一种基于LoRa远距离通信技术配套设计的一套通讯协议和系统架构。LoRaWAN网络通…

如何实现在公网下使用navicat图形化工具远程连接本地内网的MariaDB数据库

公网远程连接MariaDB数据库【cpolar内网穿透】 文章目录 公网远程连接MariaDB数据库【cpolar内网穿透】1. 配置MariaDB数据库1.1 安装MariaDB数据库1.2 测试局域网内远程连接 2. 内网穿透2.1 创建隧道映射2.2 测试随机地址公网远程访问3. 配置固定TCP端口地址3.1 保留一个固定的…

2023年了,软件测试的出路到底在哪?

前言 下面这张图片,想必大家应该都知道~~~ 其实每个人都在金字塔里面,只不过大家的高低位置不同,当然,越在底层的人越多,越在高层的人越少~ 这也符合“二八定律”,“优胜劣汰”,“适者生存”~…

蓝桥杯算法双周赛心得——迷宫逃脱(dp)

大家好,我是晴天学长,dp版的来啦,可以是受益匪浅啊,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪 1) .迷宫逃脱 迷官逃脱[算法赛] 问题描述 在数学王国中,存…

24路电磁锁控板的特点和主要参数

智能快递柜、智能生鲜柜、电子存储柜、超市寄存柜、智能送餐柜、电子更衣柜、档案柜等物联网终端设备,都是采用电磁锁控制,这种电磁锁控制板俗称锁控板。锁控板可以远程控制储物柜的开关以及远程监控并提供锁的反馈信号。沐渥开发的24路电磁锁控板可以控…

电脑键盘推荐

一、键盘分类 (1)键位个数 目前有75,84,87,98,104,108的。 (2)薄膜键盘和机械键盘 薄膜键盘就是大多数办公室常见的键盘,主要打一个便宜,耐造…

va-Q-tec实现温度敏感产品运输过程质量控制温控无忧

摘要:温度敏感产品运输对供应链全流程的温度质量要求较高,往往需要借助特殊的温湿度监测技术产品。va-Q-tec与虹科Comet合作,采用虹科Comet的U系列温度记录仪,为集装箱运输过程提供完整的温控包装解决方案。 一、客户背景 va-Q-…

跨境电商热点:如何在海外市场打开局面

随着全球化的推进,跨境电商成为连接不同国家和地区的商贸桥梁,呈现出蓬勃的发展势头。在这个竞争激烈的环境中,如何在海外市场打开局面成为跨境电商面临的关键问题。本文将深入探讨跨境电商的热点问题,分析如何有效利用市场趋势和…

AI智能网关如何助力危化品安全监测

安全是一切发展的基石和前提,在工业领域中,部分工业原料具有易燃、易爆、腐蚀、有毒有害等不同的危险特性,对于这些原材料的运输、储存、加工等行为,都需要遵循严格的安全规章制度。 针对危化品的仓储安全监测和管理,可…

Vue3(setup)中使用vue-cropper图片上传裁剪插件,复制代码直接使用

最近在项目中用到上传裁剪,看了一下代码,觉得这插件可可以。梳理了一下代码分享给大家 前端UI组件element-plus 如果你也用到了 ,快速帮你解决了问题,别忘记点赞收藏 1.首先看效果图 因为版本vue-cropper 众多 ,虽然网上有各…

前端 计算机基础篇 ( 二 )

文章目录 websockt及原理ipv4和ipv6的区别线程和进程的区别cdn原理缓存所涉及的http状态码缓存的时候设置 no-store和no-cache和max-age0这几个有什么区别token一般存放在哪儿怎么设置强缓存和协商缓存强缓存:1. 使用 Cache-Control 头字段: 协商缓存&am…

unordered_map 与 unordered_set 的使用

unordered_map unordered_map 的介绍文档 unordered_map 的介绍文档&#xff1a;来自cpluscplus.com 的中文翻译 unordered_map是存储<key, value>键值对的关联式容器&#xff0c;其允许通过keys快速的索引到与 其对应的value。在unordered_map中&#xff0c;键值通常用…

码云 -- 本地代码上传到码云

1. 在码云上创建远程仓库 复制远程仓库地址 2. 在本地代码上创建 git 仓库 在本地代码文件夹上&#xff0c;打开git 命令窗口 输入初始化命令&#xff0c;创建 git 仓库 git init3. 给 git 仓库添加远程仓库 继续输入 git 命令 git remote add origin 远程仓库地址4. 按 git 的…

数字逻辑电路基础-时序逻辑电路之触发器

文章目录 一、D触发器二、verilog源码三、综合及仿真结果一、D触发器 本文介绍数字逻辑电路中常用的基础时序逻辑电路触发器。它有记忆和存储信息功能,触发器是边沿触发电路。 下图是触发器常用表示方式(时钟上升沿有效): 触发器由两个锁存器组成,前级是主锁存器,后级…

Git工作流和Commit规范

Git大家都非常熟悉了&#xff0c;就不做过多介绍&#xff0c;但是如何用好Git、如何进行合理的分支开发、Merge你是否有一个规范流程呢&#xff1f;&#x1f4a4; 不论是一个团队一起开发一个项目&#xff0c;还是自己独立开发一个项目&#xff0c;都少不了要和Git打交道&…

C++学习笔记——static对象

一、static对象——累计创建了多少对象和正在使用的对象数目 static更多的是作为一个介入类的一个第三方成员变量。 声明为static的类成员称为类的静态成员&#xff0c;用static修饰的成员变量&#xff0c;称之为静态成员变量&#xff1b; 用static修饰的成员函数&#xff0c;称…

JS逆向之wasm逆向(二)

本文仅供技术交流和技术学习 不做其他用途 接着上一篇继续讲&#xff1a; 上篇地址&#xff1a; JS逆向之wasm逆向(二进制) 网址&#xff1a; aHR0cHM6Ly93d3cuN3E2Y3lqLmNvbTo5MDAxL3JlZ2lzdGVyNDY5Njg/aV9jb2RlPTQ0Mjc5OTU1 这个网站我们后面可以继续讲他的debugger 和滑块…