You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Colab中使用flask-ngrok部署Flask聊天机器人遇阻:无公网URL、单元格无限运行、127.0.0.1访问被拒

Colab中使用flask-ngrok部署Flask聊天机器人遇阻:无公网URL、单元格无限运行、127.0.0.1访问被拒

我之前在Colab部署Flask+ngrok的聊天机器人时也遇到过几乎一模一样的问题,折腾了好一会儿才找到症结所在。你的核心问题主要出在代码执行顺序、flask-ngrok与pyngrok的用法混淆,还有Colab环境下的一些特殊注意事项,咱们一步步来解决:

一、先理清你的代码里的致命问题

你的代码里有几个关键错误,直接导致了单元格挂起、没有公网URL输出:

  • app.run()是阻塞式调用:一旦执行到这行代码,整个单元格会被卡住,后面的public_url = ngrok.connect(5000)和线程启动代码根本不会运行,自然看不到公网URL。
  • 同时混用了flask-ngrok和手动pyngrok隧道:run_with_ngrok(app)是flask-ngrok的封装,它会自动帮你创建ngrok隧道,而你又手动调用ngrok.connect(5000),这会造成冲突,反而导致隧道无法正常创建。
  • 线程相关代码逻辑混乱:你定义了thread = threading.Thread(target=run_flask),但代码里根本没有run_flask这个函数,这也是日志混乱的原因之一。

二、两种可行的修正方案

方案1:使用flask-ngrok快速实现(推荐新手)

flask-ngrok已经封装了隧道创建逻辑,不需要手动处理线程和隧道连接,只需按以下步骤修改:

首先确保安装依赖:

!pip install flask flask-ngrok pyngrok==4.1.1

然后修正后的代码:

from flask import Flask, request, jsonify, render_template
from flask_ngrok import run_with_ngrok
from pyngrok import ngrok

# 设置ngrok auth token
ngrok.set_auth_token("你的ngrok auth token")

# Colab是临时环境,先创建templates文件夹避免模板找不到的错误
!mkdir -p templates
app = Flask(__name__, template_folder='templates')
app.debug = False

# 让flask-ngrok接管隧道创建
run_with_ngrok(app)

@app.route("/")
def index():
    return render_template("index.html")  # 确保templates文件夹内存在index.html文件

@app.route('/handle_message', methods=['POST'])
def handle_message():
    message = request.json['message']
    intents_list = predict_class(message)  # 确保你已提前定义predict_class函数
    response = get_response(intents_list, intents)  # 确保intents变量已正确定义
    return jsonify({'response': response})

if __name__ == "__main__":
    app.run()  # flask-ngrok会自动创建公网URL并打印在输出中

方案2:手动使用pyngrok管理隧道(更灵活)

如果你想自己控制线程和隧道,可以不用flask-ngrok,直接用pyngrok:

先安装依赖并准备模板文件夹:

!pip install flask pyngrok==4.1.1
!mkdir -p templates

修正后的代码:

from flask import Flask, request, jsonify, render_template
from pyngrok import ngrok
import threading

ngrok.set_auth_token("你的ngrok auth token")

app = Flask(__name__, template_folder='templates')
app.debug = False

@app.route("/")
def index():
    return render_template("index.html")

@app.route('/handle_message', methods=['POST'])
def handle_message():
    message = request.json['message']
    intents_list = predict_class(message)
    response = get_response(intents_list, intents)
    return jsonify({'response': response})

# 定义Flask运行函数,避免阻塞主线程
def run_flask():
    app.run(port=5000, use_reloader=False)  # use_reloader=False避免Colab内重复启动进程

if __name__ == "__main__":
    # 启动Flask后台线程
    flask_thread = threading.Thread(target=run_flask)
    flask_thread.start()
    
    # 创建ngrok隧道并打印公网URL
    public_url = ngrok.connect(5000)
    print(f"你的聊天机器人公网地址:{public_url}")

三、其他需要注意的细节

  • 模板文件的准备:Colab是临时环境,默认没有templates文件夹,必须先通过!mkdir -p templates创建,否则会报找不到模板的错误,这也是你日志混乱的可能原因之一。
  • 验证ngrok token有效性:可以用print(ngrok.get_auth_token())确认token是否成功设置,确保token是从ngrok官网控制台获取的有效令牌。
  • 禁用debug模式:Colab里开启Flask的debug模式(app.debug=True)会导致重复启动进程,容易引发冲突,保持app.debug=False或者在app.run()里加use_reloader=False。
  • 指定ngrok区域(可选):如果连接速度慢,可以在创建隧道时指定区域,比如ngrok.connect(5000, region='ap')(亚太区)或region='us'(美区)。

四、关于127.0.0.1访问被拒的问题

Colab是云端虚拟机环境,127.0.0.1是虚拟机的本地回环地址,你在自己的浏览器里访问这个地址当然会被拒——因为它不在你的本地机器上,必须通过ngrok生成的https://xxxx.ngrok.io公网URL才能正常访问你的聊天机器人。

按照上面的方案修正后,你应该能顺利看到公网地址,测试聊天机器人的/handle_message接口了。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 03:08:39