从零到公网可访问:用 Python + Flask 开发 Web 服务并通过 DevBridge 分享
本文记录了一次完整的开发实践:在华为云开发者空间中,用 Python + Flask 编写一个功能完整的 Web 服务,再通过 DevBridge 开发隧道将其暴露到公网,让任何人都能直接访问。全程无需公网 IP、无需端口转发、无需部署服务器。
## 背景
开发阶段经常遇到一个痛点:**本地跑起来的服务,别人访问不了**。你想给同事预览一下接口、想让手机端联调、想接收 webhook 回调——但你的开发机在内网,没有公网 IP。
传统方案是部署到云服务器上,但这太重了:改一行代码就要重新部署。ngrok 之类的内网穿透工具可以解决,但配置起来也有门槛。
华为云开发者空间提供的 **DevBridge** 开发隧道服务,正好填补了这个空隙:一条命令,把本地端口变成公网可访问的 URL。
下面是完整的实操过程。
## 环境准备
本次实践在华为云开发者空间(DevSpace)中进行,环境已预装:
- **CodeArts**:华为云的 AI 编码助手,通过 ACP 协议与沙箱交互,能自动写代码、安装依赖、启动服务
- **DevBridge**:开发隧道服务,通过 WebUI REST API 管理隧道
- **Python 3.12**:运行时环境
不需要在本地安装任何东西,全部在云端沙箱中完成。
## 第一步:开发 Python Web 服务
### 1.1 确认 CodeArts 服务可用
首先检查 CodeArts ACP(Agent Communication Protocol)服务是否正常运行:
```bash
curl -s --max-time 3 http://127.0.0.1:19300/healthz
# 输出: ok
```
服务正常,可以开始交互。
### 1.2 创建项目目录
从 `registry.json` 读取沙箱真实路径,在其下创建项目子目录:
```bash
SANDBOX_DIR=$(python3 -c "
import json
with open('/root/job-envs/registry.json') as f:
for entry in json.load(f):
if entry.get('id') == 'codearts':
print(entry['cwd']); break
")
PROJECT_DIR="$SANDBOX_DIR/python-web-service"
mkdir -p "$PROJECT_DIR"
```
### 1.3 检查端口可用性
**这一步不能省。** 在使用任何本地端口之前,必须检查它是否被占用:
```bash
ss -tlnp | grep ':8080'
# 无输出 = 端口空闲
```
8080 端口空闲,可以使用。
### 1.4 让 CodeArts 编写代码
通过 ACP 协议向 CodeArts 发送 prompt,描述需求:
```
请用 Python + Flask 创建一个简单但功能完整的 Web 服务:
1. GET / → 欢迎页面(HTML),列出所有 API
2. GET /api/info → 服务信息 JSON(名称、版本、状态、时间戳)
3. GET /api/health → 健康检查 {status: "ok"}
4. GET /api/users → 模拟用户列表 JSON
5. POST /api/echo → 接收 JSON body,原样返回并附加时间戳
6. 监听 0.0.0.0:8080
```
CodeArts 自动完成了以下工作:
1. **创建 `app.py`** — 91 行,包含所有路由和适当注释
2. **创建 `requirements.txt`** — 声明 Flask 依赖
3. **安装依赖** — `python3 -m pip install -r requirements.txt`(Flask 3.1.3 安装成功)
4. **启动服务** — 后台运行 `python3 app.py`
5. **验证所有端点** — 逐个 curl 测试,全部返回正确结果
### 1.5 服务验证结果
CodeArts 自动验证了所有端点:
```
=== GET /api/info ===
{"name":"Python Flask Web Service","status":"running",
"timestamp":"2026-11-06T02:34:24Z","version":"1.0.0"}
=== GET /api/health ===
{"status":"ok"}
=== GET /api/users ===
{"total":3,"users":[
{"id":1,"name":"Alice","email":"alice@example.com"},
{"id":2,"name":"Bob","email":"bob@example.com"},
{"id":3,"name":"Charlie","email":"charlie@example.com"}
]}
=== POST /api/echo ===
{"received":{"count":42,"message":"hello"},
"timestamp":"2026-11-06T02:34:24Z"}
```
服务在本地 8080 端口正常运行。
## 第二步:通过 DevBridge 分享到公网
### 2.1 什么是 DevBridge
DevBridge 是华为云提供的开发隧道服务。它的原理很简单:
```
你的本地服务 (localhost:8080)
↓
DevBridge 沙箱 (主动向外建立连接,不需要公网入站端口)
↓
华为云中继服务 (分配公网 URL)
↓
外部用户访问公网 URL → 中继 → 隧道 → 你的本地服务
```
关键点:**本地不需要开放任何入站端口**,DevBridge 通过主动外连建立隧道,这就像反向代理,但不需要你自己部署中继服务器。
### 2.2 初始化并检查认证
```bash
source /root/.agents/skills/huawei-cloud-jobenv-devbridge-tunnel/scripts/devbridge_cmd.sh
db_init # 确保沙箱运行
db_auth_status # 检查认证状态
# 输出: {"status": "Logged in (Huawei Cloud IAM)"}
```
认证通过,可以继续。
### 2.3 创建隧道
```bash
TUNNEL_ID=$(db_create "python-web-service" "PythonWeb服务" 72)
echo "TUNNEL_ID: $TUNNEL_ID"
# 输出: TUNNEL_ID: ae4jjsxd
```
参数说明:
- **名称**:`python-web-service`(支持中文、字母、数字、连字符)
- **描述**:`PythonWeb服务`
- **过期时间**:72 小时(范围 1-720 小时)
### 2.4 配置端口
```bash
db_port_create "$TUNNEL_ID" 8080 auto true
```
- **端口**:8080(对应 Flask 服务监听的端口)
- **协议**:auto(自动检测 HTTP/HTTPS)
- **匿名访问**:true(任何人通过链接即可访问,无需 token)
> ⚠️ 如果只是自己调试,建议设为 `false`,通过 token 认证访问。本文为了方便演示设为 `true`。
### 2.5 启动托管
```bash
PID=$(db_host "$TUNNEL_ID")
# 输出: host-1793932559226-8j9jck
```
`db_host` 会自动轮询等待隧道 URL 就绪(最多 15 秒)。
### 2.6 获取公网 URL
```bash
TUNNEL_URL=$(db_tunnel_url "$TUNNEL_ID")
echo "$TUNNEL_URL"
# 输出: https://ae4jjsxd-8080.devbridge-s2.hwtunnel.com
```
**注意:** 中继域名随集群变化,不要手动拼接 URL,始终用 `db_tunnel_url` 从 host 进程日志中读取权威地址。
## 第三步:验证公网访问
现在,这个 URL 就是公网可访问的了:
```bash
# 获取服务信息
curl https://ae4jjsxd-8080.devbridge-s2.hwtunnel.com/api/info
# → {"name":"Python Flask Web Service","status":"running",...}
# 健康检查
curl https://ae4jjsxd-8080.devbridge-s2.hwtunnel.com/api/health
# → {"status":"ok"}
# 获取用户列表
curl https://ae4jjsxd-8080.devbridge-s2.hwtunnel.com/api/users
# → {"total":3,"users":[...]}
# 测试 echo 端点
curl -X POST https://ae4jjsxd-8080.devbridge-s2.hwtunnel.com/api/echo \
-H "Content-Type: application/json" \
-d '{"message":"hello from public!"}'
# → {"received":{"message":"hello from public!"},"timestamp":"..."}
```
也可以直接在浏览器打开 `https://ae4jjsxd-8080.devbridge-s2.hwtunnel.com/` 看到欢迎页面。
## 整体流程回顾
整个过程可以用一张图概括:
```
┌─────────────────────────────────────────────────────┐
│ 华为云开发者空间 (DevSpace) │
│ │
│ ┌──────────────┐ ┌──────────────────────────┐ │
│ │ CodeArts │ │ Flask Web Service │ │
│ │ (AI 编码) │────→│ localhost:8080 │ │
│ └──────────────┘ └────────────┬─────────────┘ │
│ │ │
│ ┌────────────▼─────────────┐ │
│ │ DevBridge 沙箱 │ │
│ │ (主动外连建立隧道) │ │
│ └────────────┬─────────────┘ │
│ └──────────────────────────────────┼──────────────┘ │
└─────────────────────────────────────┼─────────────────┘
│
┌─────────────────▼─────────────────┐
│ 华为云 DevBridge 中继服务 │
│ 公网 URL 分配与流量转发 │
└─────────────────┬─────────────────┘
│
┌─────────────────▼─────────────────┐
│ 外部用户 (浏览器 / curl / 手机) │
│ https://ae4jjsxd-8080... │
└───────────────────────────────────┘
```
## 关键经验总结
### 1. 端口检查不能省
在使用任何本地端口之前,必须用 `ss -tlnp | grep ':<PORT>'` 检查。端口冲突会导致服务启动失败,而且排查起来浪费时间。
### 2. DevBridge 的匿名访问权衡
- **匿名访问 = true**:方便分享,任何人拿到链接就能访问。适合演示、预览。
- **匿名访问 = false**:需要 token 认证。适合调试敏感接口、接收 webhook。
根据场景选择,不要无脑开匿名。
### 3. 隧道 URL 不要手动拼接
中继域名随集群变化(实测 cn 环境为 `*.devbridge-s2.hwtunnel.com`),文档中的格式不一定准确。始终用 `db_tunnel_url <id>` 获取权威地址。
### 4. 端口配置变更需要重启 host
DevBridge 网关在 host 连接时将端口配置快照到内存。如果修改了 `allowAnonymous` 等设置,必须先 `db_process_stop <pid>` 再重新 `db_host <tunnel_id>` 才能生效。
### 5. 隧道有时效性
默认 72 小时过期,最长可设 720 小时(30 天)。到期后隧道自动失效。这是开发隧道,不是生产环境的长久方案。
## 适用场景
| 场景 | 是否适合 |
|------|---------|
| 给同事预览本地开发中的页面 | ✅ 非常适合 |
| 手机端联调本地 API | ✅ 非常适合 |
| 接收第三方 webhook 回调 | ✅ 适合(设为匿名 false + token) |
| 临时演示 | ✅ 适合 |
| 生产环境部署 | ❌ 不适合,请用正式部署 |
## 结语
整个流程从写代码到公网可访问,大约 5 分钟。不需要买服务器、不需要配域名、不需要开端口——这就是开发隧道的价值:**把"分享本地服务"这件事的门槛降到最低**。
如果你也在华为云开发者空间中开发,不妨试试 DevBridge。一行 `db_host` 就能把你的本地服务分享给全世界。
- 点赞
- 收藏
- 关注作者
评论(0)