从零到分享:用 Python Flask 搭建 Web 服务并通过 DevBridge 隧道公开访问

举报
yd_269944482 发表于 2026/11/10 00:27:51 2026/11/10
【摘要】 本文记录了一次完整的开发实践:在华为云开发者空间里,用 Python Flask 写一个 Web 服务,再通过 DevBridge 开发隧道把它分享到公网,让任何人都能直接访问。全程不需要公网 IP,不需要端口转发,不需要部署到服务器。## 为什么写这篇博客开发完一个本地服务后,最常遇到的问题是:"怎么给别人看看?"传统方案要么截图,要么部署到服务器——前者不够直观,后者太重。DevBrid...

本文记录了一次完整的开发实践:在华为云开发者空间里,用 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 是华为云提供的开发隧道服务,适用于开发调试和临时分享场景。*

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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