从零到分享:用 Python Flask 搭建 Web 服务并通过 DevBridge 隧道公开访问
本文记录了一次完整的开发实践:在华为云开发者空间里,用 Python Flask 写一个 Web 服务,再通过 DevBridge 开发隧道把它分享到公网,让任何人都能直接访问。全程不需要公网 IP,不需要端口转发,不需要部署到服务器。
## 为什么写这篇博客
开发完一个本地服务后,最常遇到的问题是:"怎么给别人看看?"
传统方案要么截图,要么部署到服务器——前者不够直观,后者太重。DevBridge 提供了第三条路:**一条隧道,把本地端口直接映射到公网地址**,对方打开链接就能访问你正在开发的服务。
下面是完整实操过程。
## 一、开发 Flask Web 服务
### 1.1 服务设计
我们要做的服务很简单,但该有的都有:
| 端点 | 方法 | 作用 |
|------|------|------|
| `/` | GET | 现代化 HTML 首页,展示服务信息 |
| `/api/info` | GET | 返回服务名称、版本、描述、时间戳(JSON) |
| `/api/health` | GET | 健康检查(JSON) |
| `/api/time` | GET | 格式化服务器时间(JSON) |
### 1.2 核心代码
```python
from flask import Flask, jsonify
from datetime import datetime
app = Flask(__name__)
SERVICE_NAME = "Python Web Service"
SERVICE_VERSION = "1.0.0"
SERVICE_DESCRIPTION = "A demo Flask service shared via DevBridge tunnel"
@app.route('/')
def home():
"""现代化首页 — 渐变背景 + 卡片布局"""
return f'''<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{SERVICE_NAME}</title>
<style>
* {{ margin: 0; padding: 0; box-sizing: border-box; }}
body {{
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh; display: flex; align-items: center; justify-content: center;
}}
.card {{
background: rgba(255,255,255,0.95); border-radius: 20px; padding: 48px;
box-shadow: 0 20px 60px rgba(0,0,0,0.3); max-width: 520px; width: 90%;
}}
h1 {{ font-size: 28px; color: #333; margin-bottom: 8px; }}
.version {{ color: #999; font-size: 14px; margin-bottom: 24px; }}
.status {{ display: inline-block; background: #48bb78; color: white;
padding: 4px 12px; border-radius: 12px; font-size: 13px; margin-bottom: 24px; }}
.endpoints {{ border-top: 1px solid #eee; padding-top: 20px; }}
.endpoint {{ display: flex; justify-content: space-between; padding: 8px 0;
font-size: 14px; border-bottom: 1px solid #f5f5f5; }}
.method {{ color: #667eea; font-weight: 600; }}
.path {{ color: #555; font-family: monospace; }}
</style>
</head>
<body>
<div class="card">
<h1>🚀 {SERVICE_NAME}</h1>
<div class="version">v{SERVICE_VERSION}</div>
<div class="status">● Running</div>
<p style="color:#666; font-size:15px; margin-bottom:20px;">{SERVICE_DESCRIPTION}</p>
<div class="endpoints">
<div class="endpoint"><span class="method">GET</span><span class="path">/</span></div>
<div class="endpoint"><span class="method">GET</span><span class="path">/api/info</span></div>
<div class="endpoint"><span class="method">GET</span><span class="path">/api/health</span></div>
<div class="endpoint"><span class="method">GET</span><span class="path">/api/time</span></div>
</div>
</div>
</body>
</html>'''
@app.route('/api/info')
def info():
return jsonify({
"service": SERVICE_NAME,
"version": SERVICE_VERSION,
"description": SERVICE_DESCRIPTION,
"timestamp": datetime.now().isoformat()
})
@app.route('/api/health')
def health():
return jsonify({"status": "healthy", "uptime": "ok"})
@app.route('/api/time')
def time():
now = datetime.now()
return jsonify({
"iso": now.isoformat(),
"formatted": now.strftime("%A, %B %d, %Y at %I:%M:%S %p")
})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
```
### 1.3 依赖与启动
```text
# requirements.txt
flask
```
```bash
pip install flask
python3 app.py
```
启动后控制台输出:
```
* Serving Flask app 'app'
* Running on http://127.0.0.1:8080
```
本地访问 `http://127.0.0.1:8080/` 就能看到一个带渐变背景的卡片式首页,API 端点也都能正常返回 JSON。
**到这里为止,服务只能在本机访问。** 接下来才是关键——把它分享出去。
## 二、用 DevBridge 创建公网隧道
### 2.1 什么是 DevBridge
DevBridge 是华为云提供的开发隧道服务。它的原理很简单:
```
你的本地服务 (localhost:8080)
│
▼
DevBridge 客户端(出站连接,不需要公网入站端口)
│
▼
华为云中继服务器
│
▼
公网地址:https://<tunnelId>-<port>.devbridge-s2.hwtunnel.com
```
关键点:**本地只需要出站连接**,不需要在路由器上做端口映射,不需要公网 IP。中继服务器帮你把公网请求转发到本地。
### 2.2 创建隧道
在华为云开发者空间里,DevBridge 的 WebUI 运行在 13000 端口,通过 REST API 操作:
```bash
# 1. 创建隧道(名称、描述、有效期72小时)
curl -X POST http://127.0.0.1:13000/api/tunnels \
-H "Content-Type: application/json" \
-d '{"name":"python-web-service","description":"PythonWeb服务分享","expiration":72}'
# 返回隧道 ID,例如 ae4jjsxd
```
### 2.3 配置端口
```bash
# 2. 给隧道添加端口 8080,协议自动检测,开启匿名访问
curl -X POST http://127.0.0.1:13000/api/tunnels/ae4jjsxd/ports \
-H "Content-Type: application/json" \
-d '{"port":8080,"protocol":"auto","allowAnonymous":true}'
```
几个参数的含义:
- **port**:要暴露的本地端口,这里是 8080
- **protocol**:`auto` 让系统自动判断 HTTP/HTTPS
- **allowAnonymous**:设为 `true` 表示任何人拿到链接就能访问,不需要认证。如果是内部调试,可以设为 `false`,对方需要用 token 连接
### 2.4 启动托管
```bash
# 3. 启动 host 进程,建立隧道连接
curl -X POST http://127.0.0.1:13000/api/host \
-H "Content-Type: application/json" \
-d '{"tunnelId":"ae4jjsxd"}'
```
启动后,隧道就生效了。
### 2.5 获取公网地址
```bash
# 4. 查看运行中的进程,获取公网 URL
curl http://127.0.0.1:13000/api/processes
```
返回结果中包含 `tunnelUrls` 字段:
```json
{
"tunnelUrls": ["https://ae4jjsxd-8080.devbridge-s2.hwtunnel.com"]
}
```
**这就是公网访问地址。** 把它发给任何人,对方在浏览器里打开就能看到你的服务。
## 三、验证与效果
### 3.1 访问首页
打开 `https://ae4jjsxd-8080.devbridge-s2.hwtunnel.com/`,看到的是和本地完全一样的渐变背景卡片页面。
### 3.2 调用 API
```bash
curl https://ae4jjsxd-8080.devbridge-s2.hwtunnel.com/api/info
```
```json
{
"service": "Python Web Service",
"version": "1.0.0",
"description": "A demo Flask service shared via DevBridge tunnel",
"timestamp": "2026-11-10T00:20:09.123456"
}
```
```bash
curl https://ae4jjsxd-8080.devbridge-s2.hwtunnel.com/api/health
```
```json
{"status": "healthy", "uptime": "ok"}
```
一切正常,公网访问和本地访问行为完全一致。
## 四、一些实践经验
### 隧道有效期
创建隧道时指定 `expiration`(单位小时,范围 1-720)。默认 72 小时,到期后隧道自动关闭。如果是临时演示,设短一点;如果是长期开发调试,设长一些。
### 匿名访问的取舍
`allowAnonymous: true` 方便分享,但意味着任何拿到链接的人都能访问。如果服务有敏感数据或未完成的接口,建议设为 `false`,通过 token 认证连接。
### 端口配置变更需重启
修改端口的 `allowAnonymous` 等配置后,需要先停止 host 进程再重新启动,新配置才会生效——网关在连接时会把配置快照到内存,之后改数据库不会自动刷新。
### 不是生产方案
DevBridge 隧道适合开发、调试、临时分享。**不要用它做生产环境的对外服务**——隧道有有效期,中继有带宽限制,稳定性也不适合承载真实流量。生产环境还是应该部署到 ECS、CCE 等正式计算资源上。
## 五、完整流程回顾
```
写代码 (app.py + requirements.txt)
│
▼
安装依赖 (pip install flask)
│
▼
启动服务 (python3 app.py → localhost:8080)
│
▼
创建 DevBridge 隧道 (POST /api/tunnels)
│
▼
配置端口 (POST /api/tunnels/:id/ports → port:8080, anon:true)
│
▼
启动托管 (POST /api/host)
│
▼
获取公网 URL (GET /api/processes → tunnelUrls)
│
▼
分享链接 🎉
```
从写第一行代码到拿到公网链接,整个过程不到十分钟。没有服务器配置,没有域名解析,没有 SSL 证书申请——DevBridge 帮你把这些都省了。
下次开发完一个本地服务想给人演示的时候,试试这条隧道。
---
*本文基于华为云开发者空间(DevSpace)环境实践编写。DevBridge 是华为云提供的开发隧道服务,适用于开发调试和临时分享场景。*
- 点赞
- 收藏
- 关注作者
评论(0)