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
相关产品推荐
相关产品推荐

