Search code examples
flaskgoogle-colaboratory

Why did flask_ngrok have ConnectionRefusedError: [Errno 111] Connection refused error on Colab


I was trying to flask via colab. Below is my code on google Colab:

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()

It is from this example (btw, this notebook itself has a different module error), but I kept getting

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'))

Can anyone please tell me what the problem is? I was following the tutorials and they gave me similar answers, and all led to this error from my end.

I was expecting a ngrok link like all tutorials show.


Solution

  • Was having the exact same problem myself. Turns out you just need to have an ngrok account and get an authentication token. Pretty easy fix.

    1. Go to the ngrok website and create an account: https://dashboard.ngrok.com/login

    2. In the side menu on the left, there will be a "Your Authtoken" option. Click on that, and the authtoken will be displayed for you to copy.

    3. In your google colab notebook, include the auth token at the beginning of your code right below the pip install commands. Make sure to include a "!" before it:

    !pip install flask-ngrok
    !pip install pyngrok==4.1.1
    !ngrok authtoken ######YOUR AUTHTOKEN GOES HERE#####
    

    After the packages have been installed, you should see a message like this at the bottom:

    enter image description here

    This indicates your authtoken has been saved successfully.

    1. Run the cell that starts your Flask app again, and the server should be running and contain a link to your specific ngrok url.

    I also did not include this part in my own code:

    if __name__ == '__main__':
        app.run()
    

    This tutorial was what helped me: https://youtu.be/0dYsZt8-nXk