从零到公网可访问:用 Python + Flask 开发 Web 服务并通过 DevBridge 分享

举报
yd_269944482 发表于 2026/11/06 10:42:50 2026/11/06
【摘要】 本文记录了一次完整的开发实践:在华为云开发者空间中,用 Python + Flask 编写一个功能完整的 Web 服务,再通过 DevBridge 开发隧道将其暴露到公网,让任何人都能直接访问。全程无需公网 IP、无需端口转发、无需部署服务器。## 背景开发阶段经常遇到一个痛点:**本地跑起来的服务,别人访问不了**。你想给同事预览一下接口、想让手机端联调、想接收 webhook 回调——但...

本文记录了一次完整的开发实践:在华为云开发者空间中,用 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` 就能把你的本地服务分享给全世界。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。