从零到公网可达:用 Python 开发 Web 服务并通过 DevBridge 一键分享
## 前言
作为开发者,我们经常遇到这样一个场景:本地写了个 Web 服务,想让同事、客户或者手机端临时看看效果,但不想折腾公网服务器、域名、Nginx 反向代理那一套。今天分享一个实践——**用 Python + Flask 写一个 Web 服务,再通过华为云 DevBridge 隧道把它暴露到公网**,整个过程不到 5 分钟。
---
## 一、我们要做什么
目标很简单:
1. 用 Flask 写一个 RESTful Web 服务,包含欢迎页、服务信息、健康检查、数据回显四个接口
2. 在本地 8080 端口启动
3. 通过 DevBridge 创建隧道,生成一个公网 HTTPS 链接,任何人打开就能访问
最终效果:别人拿到链接,浏览器一开就能看到你的服务,不需要装任何东西。
---
## 二、编写 Python Web 服务
### 2.1 项目结构
```
python-web-service/
├── app.py # Flask 主应用
├── requirements.txt # 依赖管理
└── start.sh # 启动脚本
```
### 2.2 依赖文件
```txt
Flask==3.0.0
```
就一个依赖,干净利落。
### 2.3 主应用 app.py
```python
from flask import Flask, request, jsonify
from datetime import datetime
app = Flask(__name__)
# 服务元信息
SERVICE_NAME = "Python Web Service"
SERVICE_VERSION = "1.0.0"
def now_iso():
"""返回当前时间的 ISO 格式字符串"""
return datetime.now().isoformat()
# ---------- 接口定义 ----------
@app.route('/')
def index():
"""欢迎页面:展示服务名称和所有可用 API"""
return '''
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Python Web Service</title>
<style>
body { font-family: sans-serif; max-width: 800px; margin: 40px auto; padding: 0 20px; color: #333; }
h1 { color: #2c3e50; }
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px 12px; text-align: left; }
th { background-color: #f4f4f4; }
code { background: #f0f0f0; padding: 2px 6px; border-radius: 3px; }
</style>
</head>
<body>
<h1>Python Web Service</h1>
<p>版本: 1.0.0</p>
<h2>可用 API 列表</h2>
<table>
<tr><th>接口</th><th>方法</th><th>说明</th></tr>
<tr><td><code>/</code></td><td>GET</td><td>欢迎页面</td></tr>
<tr><td><code>/api/info</code></td><td>GET</td><td>服务信息</td></tr>
<tr><td><code>/api/health</code></td><td>GET</td><td>健康检查</td></tr>
<tr><td><code>/api/echo</code></td><td>POST</td><td>数据回显</td></tr>
</table>
</body>
</html>
'''
@app.route('/api/info')
def info():
"""返回服务信息:名称、版本、当前时间戳"""
return jsonify({
"name": SERVICE_NAME,
"version": SERVICE_VERSION,
"timestamp": now_iso()
})
@app.route('/api/health')
def health():
"""健康检查接口,可用于负载均衡探活"""
return jsonify({
"status": "ok",
"timestamp": now_iso()
})
@app.route('/api/echo', methods=['POST'])
def echo():
"""接收 JSON body,原样返回并附加时间戳"""
data = request.get_json(silent=True) or {}
return jsonify({
"data": data,
"timestamp": now_iso()
})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
```
**代码解读:**
- `host='0.0.0.0'`:监听所有网络接口,不只是 localhost。这一步很关键——如果只监听 `127.0.0.1`,DevBridge 隧道也无法转发到你的服务
- `now_iso()`:统一时间格式,方便日志排查
- `/api/echo` 用 `silent=True`:即使客户端没发 JSON 或格式错误,也不会抛 500,而是返回空字典
### 2.4 启动脚本 start.sh
```bash
#!/bin/bash
cd "$(dirname "$0")"
pip install -r requirements.txt -q
python3 app.py
```
### 2.5 本地验证
```bash
chmod +x start.sh
./start.sh
```
服务启动后,另开终端测试:
```bash
# 健康检查
curl http://127.0.0.1:8080/api/health
# → {"status":"ok","timestamp":"2026-11-07T00:21:34.017192"}
# 回显接口
curl -X POST http://127.0.0.1:8080/api/echo \
-H "Content-Type: application/json" \
-d '{"message":"Hello!"}'
# → {"data":{"message":"Hello!"},"timestamp":"2026-11-07T00:21:50.382408"}
```
四个接口全部正常 ✅
---
## 三、通过 DevBridge 暴露到公网
### 3.1 什么是 DevBridge
DevBridge 是华为云提供的开发隧道服务。它的原理很简单:
```
你的本地服务 (localhost:8080)
│
▼
DevBridge 客户端 (主动外连,不需要开公网端口)
│
▼
华为云中继服务器
│
▼
公网 HTTPS 地址 (https://xxx.devbridge-s2.hwtunnel.com)
```
关键点:**你的机器不需要开放任何入站端口**。DevBridge 客户端主动向外建立连接,中继服务器把公网请求转发回来。这比 ngrok 的思路一样,但跑在华为云基础设施上。
### 3.2 创建隧道
通过 DevBridge WebUI API(沙箱内端口 13000),三步完成:
**第一步:创建隧道**
```bash
# 通过 DevBridge API 创建隧道
# 名称:python-web-service,有效期:72 小时
TUNNEL_ID=$(db_create "python-web-service" "PythonWeb服务分享" 72)
# → ae4jjsxd
```
**第二步:配置端口**
```bash
# 端口 8080,协议 auto(自动检测 HTTP/HTTPS),匿名访问开启
db_port_create "$TUNNEL_ID" 8080 auto true
```
这里有个参数值得说明:
| 参数 | 值 | 含义 |
|------|-----|------|
| `port` | 8080 | 要转发的本地端口 |
| `protocol` | auto | 自动判断 HTTP 还是 HTTPS |
| `allowAnonymous` | true | 允许任何人通过公网链接访问 |
**第三步:启动托管**
```bash
# 启动 host 进程,建立到中继服务器的连接
db_host "$TUNNEL_ID"
```
### 3.3 获取公网链接
```bash
db_tunnel_url "$TUNNEL_ID"
# → https://ae4jjsxd-8080.devbridge-s2.hwtunnel.com
```
这就是最终可以分享给任何人的公网地址。
---
## 四、验证公网访问
把链接发给同事,或者自己在手机上打开:
```bash
# 健康检查
curl https://ae4jjsxd-8080.devbridge-s2.hwtunnel.com/api/health
# → {"status":"ok","timestamp":"2026-11-07T00:25:01.123456"}
# 回显
curl -X POST https://ae4jjsxd-8080.devbridge-s2.hwtunnel.com/api/echo \
-H "Content-Type: application/json" \
-d '{"message":"从公网来的请求"}'
# → {"data":{"message":"从公网来的请求"},"timestamp":"2026-11-07T00:25:10.654321"}
```
浏览器直接打开 `https://ae4jjsxd-8080.devbridge-s2.hwtunnel.com/` 就能看到欢迎页面。
---
## 五、整体架构回顾
```
┌──────────────────────────────────────────────────┐
│ 开发者本地环境 │
│ │
│ Flask App (0.0.0.0:8080) │
│ │ │
│ ▼ │
│ DevBridge Host 进程 (主动外连) │
│ │ │
└───────┼──────────────────────────────────────────┘
│ 出站连接(无需入站端口)
▼
┌──────────────────────────────────────────────────┐
│ 华为云 DevBridge 中继服务 │
│ │
│ https://ae4jjsxd-8080.devbridge-s2.hwtunnel.com │
│ │
└───────┬──────────────────────────────────────────┘
│ 入站请求转发
▼
┌──────────────────────────────────────────────────┐
│ 远程用户(同事/手机/客户) │
│ │
│ 浏览器 / curl / Postman │
│ │
└──────────────────────────────────────────────────┘
```
---
## 六、几个实践要点
### 6.1 一定要监听 0.0.0.0
这是最常见的坑。Flask 默认监听 `127.0.0.1`,只有本机能访问。DevBridge 隧道虽然跑在本机,但也需要通过网络接口访问你的服务。如果写成 `app.run(port=8080)` 不加 `host='0.0.0.0'`,隧道会连不上。
### 6.2 匿名访问的取舍
`allowAnonymous=true` 意味着任何拿到链接的人都能访问。对于内部演示、临时分享很方便;但如果接口有敏感数据,建议设为 `false`,通过 tunnel token 做认证。
### 6.3 隧道有效期
默认 72 小时,最长 720 小时(30 天)。到期后隧道自动失效,不会残留。适合临时分享,不适合当生产环境用——DevBridge 本身就是开发工具,不是生产网关。
### 6.4 端口配置变更要重启 host
如果你修改了端口的协议或匿名设置,光改数据库不够,中继网关在 host 连接时把配置快照到内存了。需要先停掉 host 进程再重新启动,新配置才生效。
---
## 七、总结
整个过程可以归纳为三步:
| 步骤 | 做什么 | 耗时 |
|------|--------|------|
| 1. 写服务 | Flask + 4 个接口 | ~3 分钟 |
| 2. 启动服务 | `python3 app.py` | ~5 秒 |
| 3. 创建隧道 | `db_create` → `db_port_create` → `db_host` | ~30 秒 |
最终拿到一个 HTTPS 公网链接,任何人都能访问。不需要买服务器、不需要配域名、不需要改防火墙。
DevBridge 解决的是"开发阶段临时分享"的问题。等到要上生产了,再走正常的 ECS + EIP + 域名 + 证书流程也不迟。工具用在对的场景,才是好工具。
---
*本文涉及的服务代码和隧道配置均在华为云 AI 开发者空间中完成。DevBridge 是华为云开发工具链的一部分,了解更多请访问华为云开发者空间。*
- 点赞
- 收藏
- 关注作者
评论(0)