在Colab中使用flask_ngrok出现ConnectionRefusedError错误求助
问题:Google Colab中运行Flask+flask-ngrok无法获取公网链接,报ConnectionRefusedError
我尝试在Google Colab中运行Flask应用,使用的代码如下:
from flask import Flask !pip install flask_ngrok from flask_ngrok import run_with_ngrok app = Flask(__name__) run_with_ngrok(app) @app.route("/") def hello(): return "Hello World!" if __name__ == '__main__': app.run()
该代码来自官方示例文档(注:示例笔记本本身存在其他模块错误),但运行后持续出现以下错误:
Exception in thread Thread-11: Traceback (most recent call last): File "/usr/local/lib/python3.10/dist-packages/urllib3/connection.py", line 174, in _new_conn conn = connection.create_connection( File "/usr/local/lib/python3.10/dist-packages/urllib3/util/connection.py", line 95, in create_connection raise err File "/usr/local/lib/python3.10/dist-packages/urllib3/util/connection.py", line 85, in create_connection sock.connect(sa) ConnectionRefusedError: [Errno 111] Connection refused During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/lib/python3.10/dist-packages/urllib3/connectionpool.py", line 703, in urlopen httplib_response = self._make_request( File "/usr/local/lib/python3.10/dist-packages/urllib3/connectionpool.py", line 398, in _make_request conn.request(method, url, **httplib_request_kw) File "/usr/local/lib/python3.10/dist-packages/urllib3/connection.py", line 244, in request super(HTTPConnection, self).request(method, url, body=body, headers=headers) File "/usr/lib/python3.10/http/client.py", line 1283, in request self._send_request(method, url, body, headers, encode_chunked) File "/usr/lib/python3.10/http/client.py", line 1329, in _send_request self.endheaders(body, encode_chunked=encode_chunked) File "/usr/lib/python3.10/http/client.py", line 1278, in endheaders self._send_output(message_body, encode_chunked=encode_chunked) File "/usr/lib/python3.10/http/client.py", line 1038, in _send_output self.send(msg) File "/usr/lib/python3.10/http/client.py", line 976, in send self.connect() File "/usr/local/lib/python3.10/dist-packages/urllib3/connection.py", line 205, in connect conn = self._new_conn() File "/usr/local/lib/python3.10/dist-packages/urllib3/connection.py", line 186, in _new_conn raise NewConnectionError( urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x7f0594e70ca0>: Failed to establish a new connection: [Errno 111] Connection refused During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/lib/python3.10/dist-packages/requests/adapters.py", line 440, in send resp = conn.urlopen( File "/usr/local/lib/python3.10/dist-packages/urllib3/connectionpool.py", line 787, in urlopen retries = retries.increment( File "/usr/local/lib/python3.10/dist-packages/urllib3/util/retry.py", line 592, in increment raise MaxRetryError(_pool, url, error or ResponseError(cause)) urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=4040): Max retries exceeded with url: /api/tunnels (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f0594e70ca0>: Failed to establish a new connection: [Errno 111] Connection refused')) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner self.run() File "/usr/lib/python3.10/threading.py", line 1378, in run self.function(*self.args, **self.kwargs) File "/usr/local/lib/python3.10/dist-packages/flask_ngrok.py", line 70, in start_ngrok ngrok_address = _run_ngrok() File "/usr/local/lib/python3.10/dist-packages/flask_ngrok.py", line 35, in _run_ngrok tunnel_url = requests.get(localhost_url).text # Get the tunnel information File "/usr/local/lib/python3.10/dist-packages/requests/api.py", line 75, in get return request('get', url, params=params, **kwargs) File "/usr/local/lib/python3.10/dist-packages/requests/api.py", line 61, in request return session.request(method=method, url=url, **kwargs) File "/usr/local/lib/python3.10/dist-packages/requests/sessions.py", line 529, in request resp = self.send(prep, **send_kwargs) File "/usr/local/lib/python3.10/dist-packages/requests/sessions.py", line 645, in send r = adapter.send(request, **kwargs) File "/usr/local/lib/python3.10/dist-packages/requests/adapters.py", line 519, in send raise ConnectionError(e, request=request) requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=4040): Max retries exceeded with url: /api/tunnels (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f0594e70ca0>: Failed to establish a new connection: [Errno 111] Connection refused'))
按照教程操作但每次都出这个错,无法获取ngrok公网链接,问题出在哪里?
问题原因及解决办法
核心原因
错误指向无法连接localhost:4040——这是flask-ngrok默认获取ngrok隧道信息的端口,本质是ngrok未成功启动,具体诱因包括:
- 旧版flask-ngrok依赖的ngrok版本已不兼容Colab最新环境,无法自动下载或运行ngrok二进制文件;
- ngrok v2及以上版本强制要求使用认证令牌才能创建隧道,旧版flask-ngrok未处理该逻辑,导致启动失败;
- Colab网络策略拦截了未认证的ngrok请求,无法建立隧道连接。
解决步骤
方法1:升级并配置ngrok认证令牌(推荐)
- 注册ngrok账号,获取个人认证令牌(在ngrok控制台的"Your Authtoken"页面);
- 在Colab中运行以下代码:
!pip install flask pyngrok --upgrade from flask import Flask from pyngrok import ngrok, conf # 替换为你的ngrok认证令牌 conf.get_default().auth_token = "你的ngrok认证令牌" app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" # 启动ngrok隧道,映射Flask默认端口5000 public_url = ngrok.connect(5000).public_url print(f"Flask应用公网链接:{public_url}") app.run()
方法2:手动安装ngrok
若自动安装失败,手动下载并配置ngrok:
!wget https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-amd64.tgz !tar -xvzf ngrok-v3-stable-linux-amd64.tgz !./ngrok config add-authtoken 你的ngrok认证令牌
之后再运行方法1中的Flask+pyngrok代码即可。
方法3:使用Colab自带本地隧道(无需ngrok)
如果不想依赖ngrok,可使用Colab原生工具:
!pip install flask portpicker from flask import Flask import portpicker from google.colab.output import serve_kernel_port_as_http app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" port = portpicker.pick_unused_port() serve_kernel_port_as_http(port) print(f"访问链接:http://localhost:{port}") app.run(port=port)
内容的提问来源于stack exchange,提问作者DDDyylan
相关产品推荐
相关产品推荐

