从零到公网可达:用 Python 开发 Web 服务并通过 DevBridge 一键分享

举报
yd_269944482 发表于 2026/11/07 00:30:29 2026/11/07
【摘要】 ## 前言作为开发者,我们经常遇到这样一个场景:本地写了个 Web 服务,想让同事、客户或者手机端临时看看效果,但不想折腾公网服务器、域名、Nginx 反向代理那一套。今天分享一个实践——**用 Python + Flask 写一个 Web 服务,再通过华为云 DevBridge 隧道把它暴露到公网**,整个过程不到 5 分钟。---## 一、我们要做什么目标很简单:1. 用 Flask 写...

## 前言

作为开发者,我们经常遇到这样一个场景:本地写了个 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 是华为云开发工具链的一部分,了解更多请访问华为云开发者空间。*

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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