• FASTAPI的简单理解


    一.FASTAPI的接口建立

    app = FastAPI()
    
    @app.post('/test/tran')  # url名称
    async def deleteData(clientImageId: Optional[str] = Form(None), projectSn: Optional[str] = Form(None)):
        try:
            return {}  # ,返回结果
        except Exception as e:  # 报错处理
            return {}
            
    if __name__ == '__main__':
        uvicorn.run(app='py文件名字:app', host='0.0.0.0', port=端口号, reload=True, debug=False)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    注:根据需求,参数自行选择
    debug:是否调试
    reload:热加载

    二.传入参数简介

    1.路径参数

    from fastapi import FastAPI
    ​
    app = FastAPI()@app.get(path='/language/{language_id}')  # language_id 就是路径参数
    async def find_language(language_id: int): 
    
    return
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    上面的示例中,路径中的{language_id}声明了一个路径参数language_id,对应的函数find_language(language_id)中通过定义同名的函数参数来接受数据值,但此处未对参数类型进行定义,所以在返回数据时采用int(language_id)对数据值进行了类型转换

    # 执行请求:
    curl http://127.0.0.1:端口号/language/9  # 这儿的9就是language_id传入的数
    {"lang":"R"}
    
    • 1
    • 2
    • 3

    在上面的代码中函数参数language_id被声明为int类型。

    设置参数类型的好处:

    可以提供编辑器支持,如:错误检查、完整性检查等

    可以自动转换路径参数类型,如在上面的请求中,如果language_id不声明int类型,则按照字符串进行处理,声明为int类型后,则可自动转换为int类型。

    # 另外,还可以提供数据类型的校验
    curl http://127.0.0.1:端口号/language/python  # 这儿传入的是str的python 不符合上面设置的language_id:int类别  所以报错
    {
        "detail":[
            {
                "loc":["path","language_id"],
                "msg":"value is not a valid integer",
                "type":"type_error.integer"
            }
        ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    注:路径参数、查询参数、表单数据等都可以进行数据校验

    2.查询参数

    from fastapi import FastAPI
    app = FastAPI()
    @app.get(path='/add')
    async def find_language(vara: int = 0, varb: int = 0):    
        return {'added': vara + varb}
    
    
    执行请求:
    curl http://127.0.0.1:8000/add?"vara=2&varb=3"
    {"added":5}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在上面的代码中,函数声明的参数vara和varb由于在路径中均没有声明,所以FastAPI会解析成查询参数;同时在代码中还为参数定义了默认值

    除了int型的查询参数,还有布尔型的查询参数

    3.表单参数

    from fastapi import FastAPI, Form
    
    app = FastAPI()
    
    
    @app.post("/login/")
    async def login(username: str = Form(...), password: str = Form(...)):
        return {"username": username}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    一般上传文件也是用表单参数上传

    from fastapi import File, UploadFile
    @app.post('/img/test')  # 读取CVS文件,对整个CSV文件的数据进行加载
    async def upload_images(CSVFile: UploadFile = File(None)):
    	return
    
    • 1
    • 2
    • 3
    • 4

    UploadFile :文件参数
    CSVFile:参数名

    三.简单的参数校验

    1.查询参数校验

    from typing import Optional
    
    from fastapi import FastAPI
    
    app = FastAPI()
    
    
    @app.get("/items/")
    async def read_items(q: Optional[str] = None):  # 查询参数 q 的类型是 Optional[str],即它的类型是 str,但也可以是 None(其实,是它的默认值为 None), q 是可选参数
        results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
        if q:
            results.update({"q": q})
        return results
    
    @app.get("/items/")
    async def read_items(q: Optional[str] = Query(None, max_length=50)):  # 添加一些约束条件:即使 q 是可选的,但只要提供了该参数,该参数的长度就不能超过 50 个字符
        results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
        if q:
            results.update({"q": q})
        return results
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    查询参数 q 的类型是 Optional[str],即它的类型是 str,但也可以是 None(其实,是它的默认值为 None), q 是可选参数

    可以添加一些约束条件:即使 q 是可选的,但只要提供了该参数,该参数的长度就不能超过 50 个字符(上面代码)

    除了上面的参数校验的约束方式以外还有其余的可以参考from fastapi import Query 的Query 函数里面有的参数

    2.路径参数校验

    from typing import Optional
    
    from fastapi import FastAPI, Path, Query
    
    app = FastAPI()
    
    
    @app.get("/items/{item_id}")
    async def read_items(
        item_id: int = Path(..., title="The ID of the item to get"),
        q: Optional[str] = Query(None, alias="item-query"),
    ):
        results = {"item_id": item_id}
        if q:
            results.update({"q": q})
        return results
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    因为路径参数必须是路径的一部分,所以路径参数总是必选的,因此,声明路径参数时要使用 …,把它标记为必选参数。不过,就算使用 None 声明路径参数,或设置其它默认值也不会有任何影响,路径参数依然是必选参数。

    按需排序参数

    假设要把查询参数 q 声明为必选的 str 类型。
    而且,因为不用为该参数声明任何其它内容,因此无需使用 Query。
    但仍需使用 Path 声明路径参数 item_id。
    如果把有默认值的参数置于无默认值的参数前,Python 会报错。
    但可以重新排序,把无默认值的查询参数 q 放到最前面。
    FastAPI 不关注参数排序。只是通过声明的参数名称、类型和默认值(Query、Path 等)来检测参数,不关注参数的顺序。

    from fastapi import FastAPI, Path
    
    app = FastAPI()
    
    
    @app.get("/items/{item_id}")
    async def read_items(
        q: str, item_id: int = Path(..., title="The ID of the item to get")
    ):
        results = {"item_id": item_id}
        if q:
            results.update({"q": q})
        return results
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    中文官网:https://www.itdocs.icu/fastapi/tutorial/request-forms/

  • 相关阅读:
    试试使用 Vitest 进行组件测试,确实很香。
    Spring 理解
    微信公众号获取openid流程
    vue2计算属性
    7 天找个 Go 工作,Gopher 要学的条件语句,循环语句 ,第3篇
    目标检测之多尺度融合
    网课查题API接口(免费)
    电脑怎么提取图片中的文字?
    C++11:异常和智能指针
    《管理学》期末重点
  • 原文地址:https://blog.csdn.net/weixin_36723038/article/details/127575819