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

原则:

  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={501: 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.mfbz.cn/a/171470.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单片机和FreeRTOS上跑机器人ROS的应用

机器人的应用越来越广泛了,大家熟知的稚晖君直接创业搞机器人,可想而至,接下来的十年,机器人绝对是热门的行业。 目前市面上很多机器人都是基于一套叫做ROS的系统开发的,今天就给大家分享一个跑在MCU上,基…

红葡萄酒和白葡萄酒哪个好?哪个更适合你?

云仓酒庄的品牌雷盛红酒分享接触葡萄酒不久的小伙伴不知道红葡萄和白葡萄酒哪个更好,更适合自己。其实,任何葡萄酒不论价位、风格、颜色,没有哪个更好,只有哪个更适合品饮者。 红葡萄酒之所以呈现出浓艳的颜色,是在酿造…

网站监控的重要性及实施策略

随着互联网的快速发展,网站已经成为企业和个人不可或缺的在线服务平台。然而,网站的安全性和稳定性一直是企业及个人非常关注的问题。一旦网站出现故障或者被攻击,将会给企业和个人带来严重的损失。因此,实施有效的网站监控策略对…

我了解的3D游戏引擎和图形开发框架

如果你像我一样,没有什么比编写或设计软件更让人兴奋的了。 当我编写代码时,我所获得的巨大快乐促使我开发了跨越许多软件领域的项目。 这些领域之一是为本机应用程序、桌面展示或 Web 创建 3D 图形。 我从未创建过任何 3D 游戏,但很多时候我…

基于JAVA+SSM+VUE+微信小程序的前后端分离的生活日用品交易平台的设计与实现

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 随着互联网的快速发展…

Python Web框架的三强之争:Flask、Django和FastAPI

JetBrains 公布 2022 Python 开发者调查结果。 完整报告地址:https://lp.jetbrains.com/zh-cn/python-developers-survey-2022/ 这是由 Python 软件基金会 (PSF) 和 JetBrains 共同开展的第六次官方年度 Python 开发者调查,回复于 2022 年 10 月至 12 …

国外客户要求免费样品?我来教你如何应对

这一次的问题对外贸业务员来说是非常重要。无论你是做什么行业,无论你是做什么产品我相信这个问题对你来说超级有用。 关于发样品给客户我有四个方案来跟大家分享,我希望你能够喜欢希望你很认真的思考一下: 方法一【样品费及运费一起收】&am…

【网络编程】简述TCP通信程序,三次握手,四次挥手

文章目录 🎄TCP通信程序⭐打印字符串✨中文乱码问题🎈解决方法 🌺TCP三次握手🌺TCP四次挥手🛸其他 🎊专栏【网络编程】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 &#x1f386…

腾讯云标准型S5云主机性能评测_CPU内存_带宽系统盘测评

腾讯云服务器CVM标准型S5实例具有稳定的计算性能,CVM 2核2G S5活动优惠价格280.8元一年自带1M带宽,15个月313.2元、2核4G配置748.2元15个月,CPU内存配置还可以选择4核8G、8核16G等配置,公网带宽可选1M、3M、5M或10M,腾…

buildAdmin 后端控制器的代码分析

buildAdmin的代码生成&#xff0c;很像是 fastadmin 的生成模式&#xff0c;当我们利用数据库生成了一个控制器的时候&#xff0c;我们可以看到&#xff0c; 它的生成代码很简洁 <?phpnamespace app\admin\controller\askanswer;use app\common\controller\Backend;/*** 回…

2023.11.19使用flask制作一个文件夹生成器

2023.11.19使用flask制作一个文件夹生成器 实现功能&#xff1a; &#xff08;1&#xff09;在指定路径上建立文件夹 &#xff08;2&#xff09;返回文件夹的路径和建立成功与否的提示 main.py import os from flask import Flask, request, jsonify, render_templateapp F…

archery修改为不能自提自审核上线SQL

目录 背景修改代码效果参考 背景 我和同事都可以提交上线SQL&#xff0c;但是不能自己提交的SQL自己去审核通过。目前的情况是可以自提自审。 修改代码 找到/opt/archery/sql/utils/workflow_audit.py文件 ...省略...# 判断用户当前是否是可审核staticmethoddef can_revie…

VScode调试没有反应

点击调试按钮后没反应 有可能是vscode中安装的python插件版本问题 可以通过重新安装比较旧一点的python尝试解决此问题 步骤如下&#xff1a; 然后从中选择比当前版本更低的版本即可 安装完成后需重启vscode

【从入门到起飞】JavaSE—多线程(1)(实现方式,成员方法)

&#x1f38a;专栏【JavaSE】 &#x1f354;喜欢的诗句&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f33a;进程&#x1f33a;线程&#x1f384;并发&am…

线性表但是是Java中数组实用使用

线性表定义&#xff1a; 由n (n≥0)个数据特性相同的元素构成的有限序列称为线性表&#xff0c;(n0)的时候被称为空表。 线性表的顺序表示 线性表的顺序存储又被称为顺序表 优点 无需为表示表中元素之间的逻辑关系而增加额外的存储空间可以随意读取任意位置的元素 缺点 插入…

商品购物管理与推荐系统Python+Django网页界面+协同过滤推荐算法

一、介绍 商品管理与推荐系统。本系统使用Python作为主要开发语言&#xff0c;前端采用HTML、CSS、BootStrap等技术搭建显示界面&#xff0c;后端采用Django框架处理用户的请求响应。 创新点&#xff1a;使用协同过滤算法&#xff0c;以用户对商品的评分作为依据&#xff0c;在…

[C国演义] 第二十二章

第二十二章 不同的子序列交错字符串 不同的子序列 力扣链接 两个数组的dp问题 (子序列 && 子数组(子串)) ⇒ 分区间来讨论 ⇒ dp[i][j] -- 在s数组的[0, i]区间内, 去寻找t数组在[0, j]这段子串的个数 状态转移方程 遍历顺序 初始化 需要使用左上角的情况 ⇒ dp…

筒仓料位监测|敢不敢对“精度”下狠手!您家筒仓料位测得准吗?

您家是不是还在人工敲仓估算&#xff1f; 您能精确知道料位和库存吗&#xff1f; 您能实时看到库存盈亏吗&#xff1f; 筒仓里装了什么&#xff1f;用了多少&#xff1f; 什么时候进料最划算&#xff1f; 您家的筒仓管理方式可靠吗&#xff1f; 上海思伟筒仓料位监测方案 看…

亚马逊出口电热毯日本PSE认证需要什么资料解析

电热毯出口日本需要办理PSE认证&#xff0c;电热毯&#xff0c;又名电褥&#xff0c;是一种接触式电暖器具。 PSE认证介绍是日本强制性认证&#xff0c;包含安全及EMI&#xff0c;用以证明电子电气等产品符合日期电气用品安全法或国际IEC标准的要求。日本电气用品安全法规定&am…

vue-waterfall2 实现瀑布流,及总结的问题

注意&#xff1a;引入需要在主界面引入&#xff0c;直接在组件中引用会有问题 1.安装 npm install vue-waterfall21.8.20 --save &#xff08;提示&#xff1a;一定要安装1.8.20&#xff0c;最新版会有一部分问题&#xff09; 2.打开main.js文件 import waterfall from v…