iT邦幫忙

2022 iThome 鐵人賽

DAY 4
0
自我挑戰組

先報名再說系列 第 6

Day 06 - API

  • 分享至 

  • xImage
  •  

將 FastAPI 結合進來通過 API 來執行 PowerShell 命令,為了之後在寫前端時 response 都能有個統一的格式,先定義回傳的格式如下:

{
code: 20000,
message: "success",
    data: {
    msg: "Hello Wolrd!
    "
    }
}

封裝統一的 response 的函式

def reponse(*, code=20000,data: Union[list, dict, str],message="success") -> Response:
    return JSONResponse(
        status_code=status.HTTP_200_OK,
        content={
            'code': code,
            'message': message,
            'data': data,
        }
    )

將 subprocess run 函數參數調整為 stdout=PIPE 和 stderr=STDOUT 可以將 stdout 和 stderr 合併,執行預先定義好的命令搭配 response 的函式輸出結果

@app.get("/test_command")
def test_command():
    command = "powershell -Command Write-Host 'Hello Wolrd!'"
    ret = subprocess.run(command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,encoding="utf-8")
    if ret.returncode < 0:
        return reponse(code=10000,data={'msg':"命令中斷"},message="error")
    else: 
        return reponse(data={'msg':ret.stdout},message="success")

通過瀏覽器訪問 API,可以看到 JSON 格式的回覆
https://ithelp.ithome.com.tw/upload/images/20220917/20130568kke5LJPfgx.png

接者將命令調整可以參數傳入,定義請求體

class Item(BaseModel):
    command: str

新建一個 API 並使用 HTTP 方法中的 POST 操作

@app.post("/command/")
async def execute_command(item: Item):
    ret = subprocess.run(item.command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,encoding="utf-8")
    if ret.returncode < 0:
        return reponse(code=10000,data={'msg':"命令中斷"},message="error")
    else: 
        return reponse(data={'msg':ret.stdout},message="success")

測試使用 Postman

參數傳入使用 Body 中的 raw 並選取 JSON 格式

https://ithelp.ithome.com.tw/upload/images/20220917/201305686GO8X1nCLO.png

https://ithelp.ithome.com.tw/upload/images/20220917/20130568W4dXMLoATz.png

參考資源

FastAPI 學習之路(五十九)封裝統一的json返回處理工具

請求體

subprocess --- 子进程管理


上一篇
Day 05 - 通過 Python 調用命令
系列文
先報名再說6
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言