目錄
一.引言
二.FastAPI Server 構(gòu)建
1.get - read_items
2.post - create_item
3.uvicorn - run_app
三.Postman 請求
1.post - create_item
2.get - read_items
四.Requests 請求
1.post - create_item
2.get - read_items
五.總結(jié)
一.引言
前面介紹了 LLM 的相關(guān)知識,從樣本加載、模型加載到后面的模型訓(xùn)練與模型推理,我們經(jīng)歷的完整的 LLM LoRA 微調(diào)與推理流程?;谇懊娴念A(yù)訓(xùn)練模型,我們嘗試使用 FastAPI 構(gòu)建接口服務(wù),本文主要介紹最基本的 FastAPI get、post 用法,后續(xù)介紹完整的 server 部署。
二.FastAPI Server 構(gòu)建
下面我們構(gòu)建一個 API 服務(wù),共包含兩個方法:
◆ read_items?- 將 items 數(shù)組的元素打印出來
◆ create_item?- 向 items 數(shù)組添加一個元素
1.get - read_items
get 方法是 HTTP 請求的一種類型,通常用語從服務(wù)器獲取數(shù)據(jù)。由于 read_items 方法是從服務(wù)器獲取 items 數(shù)組,所以其對應(yīng) get 請求。get 請求通常沒有請求體,所有參數(shù)都放在 URL 的查詢字符串中,所以存在一定的安全性問題。
# -*- coding: utf-8 -*-
from fastapi import FastAPI, Form
app = FastAPI()
# 示例數(shù)據(jù)
items = []
# GET 請求
@app.get("/items")
async def read_items():
return items
2.post - create_item
post 方法是區(qū)別于 get 的另一種 HTTP 請求類型,通常用于向服務(wù)器發(fā)送數(shù)據(jù)。post 通常包含一個請求體,傳輸?shù)膮?shù)不需要通過 '?' 顯式的體現(xiàn)在請求的 URL 中,而是可以通過 JSON 對象傳遞,相對 get 方法更加安全。與 get 相比,post 操作不是冪等的,其每次執(zhí)行完可能得到不同的結(jié)果,而 get 操作則通常認為是冪等的,這意味著多次執(zhí)行 get 得到的結(jié)果應(yīng)該是相同的。
# POST 請求
@app.post("/items")
async def create_item(item: str = Form(None)):
items.append(item)
return {"message": "Item created successfully: {}".format(str(item))}
這里 Post 請求成功后會有成功的提示并打印成功添加的 item。
3.uvicorn - run_app
uvicorn.run(app, host="192.XXX.XXX", port=8001) 方法是 uvicorn 的命令行接口。其中,app 是你想要運行的應(yīng)用對象,對應(yīng)我們上面的 FastAPI 的 get 與 post 對應(yīng)的方法,host 和 port 則是服務(wù)將要監(jiān)聽的 IP 地址和端口。該方法會啟動一個 ASGI 服務(wù)器,以指定的 host 和 port 為你的應(yīng)用提供服務(wù)。后續(xù)的 HTTP 請求的 URL 也是基于上面的 host 和 port 組成。下面我們在本機起一個 FastAPI 服務(wù)。
if __name__ == '__main__':
import uvicorn
uvicorn.run(app, host='0.0.0.0', port=7788)
運行主函數(shù)后出現(xiàn)如下提示代表 Server 啟動成功,我們后續(xù)對應(yīng)的 HTTP 請求 URL 為圖中藍色鏈接 http://0.0.0.0:7788:?
三.Postman 請求
針對上面構(gòu)建的 HTTP 服務(wù),我們可以通過顯示的 App 例如 postman 進行 get 和 post 請求。
1.post - create_item
打開 postman 選擇 POST?命令,輸入對應(yīng)的 URL + 函數(shù)對應(yīng)的路徑,上面 get 和 post 請求對應(yīng)的路徑都是 URL + items,在對應(yīng) form-data 處傳遞要添加的 item,注意這里 key 要和函數(shù)定義的參數(shù)名稱完全對應(yīng),否則會報錯。執(zhí)行 send 按鈕發(fā)送 Http 請求,從返回的 Body 中我們看到成功添加 python 到 items 列表中。后面我們修改 value 為 'java' 和 'c++' 并依次發(fā)送 post 指令。
server 端也要每次請求的具體信息,status_code == 200 代表請求成功。
2.get - read_items
將請求模式切換為 GET,由于 get 命令未傳參數(shù),所以直接輸入對應(yīng)地址 Send 發(fā)送請求即可。返回的結(jié)果中包含我們上面添加的三個元素:python、java、c++。server 端也增加對應(yīng)的 get 請求日志:
四.Requests 請求
上面 Postman 采用顯式的頁面方式向 server 發(fā)送 HTTP 請求并獲取結(jié)果,更常規(guī)的做法是通過 requests 庫使用代碼發(fā)送請求并處理返回結(jié)果。
1.post - create_item
def post(text):
url = 'http://0.0.0.0:7788/items'
# 構(gòu)建請求數(shù)據(jù)
data = {
'item': text
}
# 發(fā)送 post 請求
response = requests.post(url=url, data=data, timeout=10)
# 檢查響應(yīng)狀態(tài)
if response.status_code == 200:
print('請求成功')
print(response.json())
else:
print('請求失敗,狀態(tài)碼:', response.status_code)
requests.post 添加對應(yīng) url 與 data,data 為 map 形式,其中要包含 post 函數(shù)對應(yīng)的 key,結(jié)尾處會根據(jù) status_code 判斷請求是否成功。從 server 日志可以看出這一次 create_item 也執(zhí)行成功了:
2.get - read_items
def get():
url = 'http://0.0.0.0:7788/items'
response = requests.get(url)
if response.status_code == 200:
data = response.json()
print('成功獲取,返回:', data)
else:
print('請求失敗,狀態(tài)碼:', response.status_code)
requests.get 直接傳入對應(yīng) url 即可獲取對應(yīng)信息:
server 端如下日志代表本次 get 請求成功:?
文章來源:http://www.zghlxwxcb.cn/news/detail-753767.html
五.總結(jié)
上面介紹了如何使用 FastAPI 搭建簡單的 Server Demo,后續(xù)基于該方法構(gòu)建 LLM Server。文章來源地址http://www.zghlxwxcb.cn/news/detail-753767.html
到了這里,關(guān)于Python - FastAPI 實現(xiàn) get、post 請求的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!