QPython 内置浏览器——HTTP 请求与网页预览
三种网络访问方式
在 QPython 中访问网络有三种途径:
| 方式 | 场景 | 说明 |
|---|---|---|
| QPython 内置浏览器 | 打开网页、预览 HTML | 轻量 WebView |
| Python 标准库 urllib | 基础 HTTP 请求 | 零依赖 |
| requests / httpx 库 | 更强大的 HTTP 客户端 | 需安装 |
QPython 内置浏览器
QSL4A 提供 droid.webViewShow() 可以拉起内置浏览器打开网页:
from androidhelper import Android
droid = Android()
# 打开一个网页
droid.webViewShow("https://www.python.org")
这个浏览器基于 Android WebView,不是完整的 Chrome——支持基础 HTML / CSS / JavaScript,但可能不支持某些现代前端特性。
用途
- 查看文档:在手机上打开在线文档、API 参考
- 预览 HTML:本地生成的 HTML 文件直接在 QPython 里预览
- 配合 Web 开发:Flask 服务启动后,用内置浏览器访问
localhost:5000
HTML 预览示例
如果你用 Python 生成了一段 HTML 并保存为文件:
html_content = """
<html>
<body>
<h1>Hello from QPython</h1>
<p>这是一段生成的 HTML</p>
</body>
</html>
"""
with open("report.html", "w") as f:
f.write(html_content)
# 用内置浏览器预览
droid.webViewShow("file:///data/data/org.qpython.qpy/files/report.html")
Python 标准库 HTTP 请求
不依赖第三方库,用 Python 自带的 urllib:
import urllib.request
import urllib.parse
# GET 请求
response = urllib.request.urlopen("https://httpbin.org/get")
data = response.read().decode("utf-8")
print(data)
# POST 请求
data = urllib.parse.urlencode({"name": "test"}).encode()
req = urllib.request.Request("https://httpbin.org/post", data=data)
response = urllib.request.urlopen(req)
print(response.read())
urllib 功能齐全但写法繁琐。简单场景够用,但复杂的 API 调用(处理 headers、cookies、JSON 等)用 requests 更舒服。
requests 库
通过 QPYPI 安装 requests 包后:
import requests
# GET 请求(自动解码 JSON)
response = requests.get("https://api.github.com/repos/python/cpython")
print(response.json()["stargazers_count"])
# POST + JSON
response = requests.post(
"https://api.example.com/data",
json={"key": "value"},
headers={"Authorization": "Bearer token"}
)
print(response.status_code, response.text)
# 带超时
response = requests.get("https://slow-api.example.com", timeout=5)
# 错误处理
try:
response = requests.get("https://httpbin.org/status/404")
response.raise_for_status() # 状态码非 2xx 抛异常
except requests.RequestException as e:
print(f"请求失败: {e}")
网络请求的注意事项
首次联网可能慢
QPython 的网络请求第一次执行时,Android 可能弹出权限请求或进行 DNS 解析。后续请求会快很多。
HTTPS 证书问题
极少数情况下,QPython 内置的 CA 证书过期可能导致 HTTPS 请求失败(报 SSL: CERTIFICATE_VERIFY_FAILED)。解决:
- 更新 QPython App 到最新版
- 或手动忽略证书验证(仅用于调试,不推荐生产):
import requests
requests.packages.urllib3.disable_warnings()
response = requests.get("https://self-signed.badssl.com/", verify=False)
网络超时设置
手机网络不稳定是常态,所有网络请求都应该设置超时:
response = requests.get(url, timeout=10) # 10 秒超时
不设超时的话,请求可能无限挂起,脚本就卡着不动了。
后台网络请求
如果脚本在后台持续执行网络请求,需要:
- 申请前台服务权限
- 显示通知提示用户脚本仍在运行
- 遵守 Android 的网络访问规则
小结
QPython 的网络访问能力有三层:内置浏览器看网页、urllib 做基础请求、requests 做复杂 API 调用。所有 HTTP 请求必须设超时——手机网络不稳定是最大的风险点。requests 库功能最强,建议装一个;urllib 零依赖,应急用也行。
进入硬件与自动化部分,这是 QPython 区别于 PC Python 的另一个核心价值区。