zoukankan      html  css  js  c++  java
  • FastApi学习(二)

    前言

    继续学习

    此为第二篇, 还差些知识点就可以结束, 更多的比如用户的身份校验/ swagger 文档修改等以后会单独写

    正文

    使用枚举来限定参数

    可以使用枚举的方式来限定参数为某几个值之内才通过

    from fastapi import FastAPI
    from enum import Enum
    
    
    class ModelName(str, Enum):
        alexnet = "alexnet"
        resnet = "resnet"
        lenet = "lenet"
    
    
    app = FastAPI()
    
    
    @app.get("/model/{model_name}")
    async def get_model(model_name: ModelName):  # 限定参数必须是ModelName枚举中的
        if model_name == ModelName.alexnet:  # 枚举判断方法1
            return {
                "model_name": model_name
            }
        if model_name.value == "lenet":  # 枚举判断方法2
            return {
                "model_name": model_name
            }
        return {
            "model_name": model_name
        }
    

    Fast错误返回

    以上面为例, 如果你传递了不在枚举中的参数, Fast 会返回错误给客户端, 例如

    {
        "detail": [
            {
                "loc": [
                    "path",  # 出错的地方
                    "model_name"  # 具体的参数
                ],
                "msg": "value is not a valid enumeration member; permitted: 'alexnet', 'resnet', 'lenet'",  # 出错信息
                "type": "type_error.enum",  # 出错type
                "ctx": {
                    "enum_values": [
                        "alexnet",
                        "resnet",
                        "lenet"
                    ]
                }
            }
        ]
    }
    

    URL传递路径参数

    有时候需要传递路径参数给后端, 如果使用灵活的方式

    @app.get("/files/{file_path:path}")
    async def read_file(file_path: str):
        return {
            "file_path": file_path
        }
    

    设置参数为 path 即可,注意 : 后不能加空格否则会404

    因为我们匹配的 URL files本身后面加了 /, 如果我们想在传递时读取到的参数本身前面就带有 /, 写 // 即可, 例如: http://127.0.0.1:8000/files//home/johndoe/myfile.txt 读取到的就是 /home/johndoe/myfile.txt

    参数默认值

    对于需要分页的接口来说,通常需要传递 page 和 page_size , 而通常, 为了提高代码健壮性, 我们需要给 page 和 page_size 指定一个默认值, 在(一)中我们介绍了如何设置某个字段为可传, 现在我们在FastApi 中指定参数默认值的方法如下

    @app.get("/log")
    async def get_logs(page: int = 1, page_size: int = 20):
        return {
            "page": page,
            "page_size": page_size
        }
    

    测试不带参数 http://127.0.0.1:8000/log

    返回默认值

    {
        "page": 1,
        "page_size": 20
    }
    

    测试带参数 http://127.0.0.1:8000/log?page=2

    返回

    {
        "page": 2,
        "page_size": 20
    }
    

    Form表单传参

    我们之前讲了从 body 的 JSON 里获取参数, 这里说一下从传统的 Form 表单里获取数据(application/x-www-form-urlencoded/multipart/form-data)

    想要从 Form 中获取数据,需要导入 Form 模块, 并且安装 python-multipart

    from fastapi import FastAPI, Form
    
    
    app = FastAPI()
    
    @app.post("/login")
    async def login(*, name: str = Form(...), pwd: str = Form(...)):  # 函数的接受参数第一个是 * 代表此函数只接受关键字传参
        # Form(...) 必写
        return {
            "name": name,
            "pwd": pwd
        }
    
  • 相关阅读:
    做运维的感悟(做运维需要考虑事,运维组织结构,运维学习地图....)
    Go实现ssh执行远端命令及远程终端
    Go加密算法总结
    Vue项目上线环境部署,项目优化策略,生成打包报告,及上线相关配置
    博客园代码折叠
    win10关闭锁屏,直接进入登录界面

    多路查找树
    树结构的应用
    二叉树
  • 原文地址:https://www.cnblogs.com/chnmig/p/12615797.html
Copyright © 2011-2022 走看看