基于華為云 ModelArts 的在線服務應用開發(Requests 模塊)
一、本節目標
- 了解并掌握 Requests 模塊的特點與用法
- 學會通過 Python+Requests 訪問華為云 ModelArts 在線推理服務
- 熟悉 JSON 模塊在 Python 中的數據序列化與反序列化
- 掌握 Python 文件 I/O 的基本操作
- 演示一個基于華為云 ModelArts + PyQt 的花卉分類桌面應用案例
二、Requests 模塊簡介與特點
-
簡介
-
requests
是 Python 第三方庫,用于發送 HTTP/HTTPS 請求 -
安裝命令:
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
-
-
主要特點
- 簡單易用:人性化 API,幾行代碼即可完成請求
- 支持 HTTPS:自動驗證 SSL 證書
- 支持 Cookies:自動管理會話狀態
- 支持文件上傳:
files
參數上傳本地文件 - 支持會話管理:
requests.Session()
跨請求保持連接和 Cookie
三、HTTP 協議基礎
- 什么是 HTTP?
- 超文本傳輸協議(HTTP)是基于 TCP 的請求–響應協議
- 典型事務流程:
- 客戶端(瀏覽器或腳本)與服務器建立 TCP 連接
- 客戶端發送 HTTP 請求
- 服務器處理請求并返回響應
- 連接關閉或復用
- TCP/IP 七層模型(應用層:HTTP)
- 常見狀態碼
2xx
成功:200 OK
,201 Created
3xx
重定向:301 Moved Permanently
4xx
客戶端錯誤:400 Bad Request
,401 Unauthorized
,404 Not Found
5xx
服務器錯誤:500 Internal Server Error
四、Requests 安裝與基本示例
import requests# 發送 GET 請求
resp = requests.get('https://api.example.com/data')
print(resp.status_code) # HTTP 狀態碼
print(resp.text) # 響應內容(字符串)# 發送 POST 請求并上傳文件
files = {'file': open('test.jpg', 'rb')}
resp = requests.post('https://api.example.com/upload', files=files)
print(resp.status_code, resp.text)
- 返回屬性
resp.status_code
:整數狀態碼resp.text
:響應體(Unicode 文本)resp.json()
:直接將響應解析為 Python 對象(如果是 JSON)resp.headers
:響應頭字典
五、Requests 支持的 HTTP 方法
方法 | 用途 |
---|---|
GET | 獲取資源 |
POST | 創建資源 |
PUT | 更新資源 |
DELETE | 刪除資源 |
HEAD | 獲取頭部信息 |
OPTIONS | 獲取支持的 HTTP 方法 |
六、基于華為云 ModelArts 的在線服務訪問
1. 獲取 AK/SK
- 在華為云控制臺 → 我的憑證 → 訪問密鑰,記錄 Access Key (AK) 和 Secret Key (SK)
2. 獲取在線服務信息
- 在 ModelArts 控制臺 → 推理服務 → 找到已部署服務,復制 推理地址 URL
3. 下載 Python SDK
pip install apig-sdk
4. 編寫調用代碼
from apig_sdk import signer
import requests, json# 1) 構造請求簽名
request = signer.HttpRequest('POST', url, {'x-sdk-content-sha256': 'UNSIGNED-PAYLOAD'})
sig = signer.Signer()
sig.Key = AK; sig.Secret = SK
sig.Sign(request)# 2) 發送請求
files = {'images': open('flower.jpg','rb')}
resp = requests.request(request.method,f"{request.scheme}://{request.host}{request.uri}",headers=request.headers,files=files
)# 3) 解析結果
print(resp.status_code)
result = resp.json()
print(json.dumps(result, indent=2))
- 參考文檔:華為云推理服務 API 指南
七、JSON 模塊簡介與使用
-
什么是 JSON?
- 一種輕量級的數據交換格式,文本可讀性高
-
Python 內置模塊
json
import json# 序列化:Python → JSON 字符串 s = json.dumps({'class': 'flower', 'score': 0.92}, ensure_ascii=False)# 反序列化:JSON 字符串 → Python obj = json.loads('{"class":"rose","score":0.87}')
八、Python 的文件 I/O 操作
-
基本函數
f = open('data.txt', 'r', encoding='utf-8') text = f.read() # 讀取全部 f.close()with open('data.txt','w',encoding='utf-8') as f:f.write('Hello, ModelArts!\n') # 自動 close
-
常用模式
模式 含義 'r'
只讀(默認) 'w'
寫入(覆蓋) 'a'
追加 'rb'
二進制讀 'wb'
二進制寫
九、Base64 編碼簡介
-
用途
- 減少 HTTP 請求數,將小圖片直接嵌入 HTML/CSS/JS
- 簡單“加密”傳輸(非安全加密)
- 適合小圖標、背景圖
-
Python 示例
import base64# 編碼 data = open('flower.jpg','rb').read() b64 = base64.b64encode(data).decode('ascii')# 解碼 raw = base64.b64decode(b64) open('out.jpg','wb').write(raw)
十、基于華為云 + PyQt 實現花卉分類桌面應用案例
-
環境準備
pip install PyQt5 requests apig-sdk
-
界面設計
- 一個按鈕:選擇本地圖片
- 一個
QLabel
:顯示加載的圖片 - 一個
QTextEdit
:展示分類結果
-
工作流程
- 點擊“打開圖片” → 彈出文件對話框 → 讀取并顯示圖片
- 將圖片通過 Requests 調用 ModelArts 接口 → 解析 JSON
- 在結果框中按置信度從高到低顯示:類別 + 得分
-
核心代碼示例
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QFileDialog, QTextEdit from PyQt5.QtGui import QPixmap import requests, json from apig_sdk import signerclass FlowerApp(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle('花卉分類 Demo')self.resize(600,400)# … 初始化按鈕、圖片區、結果區 …def open_image(self):path, _ = QFileDialog.getOpenFileName(self, '選擇圖片', '', 'Images (*.png *.jpg)')pix = QPixmap(path).scaled(300,300)self.image_label.setPixmap(pix)self.call_inference(path)def call_inference(self, img_path):# 同上節:簽名 + requests + resp.json()result = resp.json()# 排序并顯示text = '\n'.join(f"{cls}: {score:.2f}" for cls,score in zip(result['detection_classes'], result['detection_scores']))self.result_edit.setPlainText(text)if __name__ == '__main__':app = QApplication([])win = FlowerApp()win.show()app.exec_()
-
運行:
python flower_app.py
,即可體驗離線 GUI + 在線推理相結合的完整流程。
溫馨提示:
- 調試時可在命令行打印
resp.text
與resp.status_code
,快速定位簽名或網絡錯誤- PyQt 界面可按需擴充:增加進度條、錯誤提示、模型選擇等
- 在生產環境中,注意對 AK/SK 做妥善管理,不要硬編碼在腳本中