基于华为云 ModelArts 的在线服务应用开发(Requests 模块)
基于华为云 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 做妥善管理,不要硬编码在脚本中