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
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM