Home > front end >  Pytgon Request Library and Docker Container
Pytgon Request Library and Docker Container

Time:11-25

Wrote basic flask app like this:

import flask
from flask import request, jsonify,render_template

app = flask.Flask(__name__)
app.config["DEBUG"] = False



@app.route('/')
def home():
    a=dict()
    a["araba"]="tyt"
    a["araba2"]="rnt"
    return a

if __name__ == "__main__":
    app.run(host='0.0.0.0')

It's working with docker container localhost:50003. Also its basic request code here:

import requests as req

resp = req.get("http://localhost:5003/")

print(resp.text)

When i use this request code with PyCharm can request and getting response. But when i want to use it with docker container i am getting this fail:

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/urllib3/connection.py", line 174, in _new_conn
    conn = connection.create_connection(
  File "/usr/local/lib/python3.8/site-packages/urllib3/util/connection.py", line 96, in create_connection
    raise err
  File "/usr/local/lib/python3.8/site-packages/urllib3/util/connection.py", line 86, 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.8/site-packages/urllib3/connectionpool.py", line 699, in urlopen
    httplib_response = self._make_request(
  File "/usr/local/lib/python3.8/site-packages/urllib3/connectionpool.py", line 394, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/usr/local/lib/python3.8/site-packages/urllib3/connection.py", line 239, in request
    super(HTTPConnection, self).request(method, url, body=body, headers=headers)
  File "/usr/local/lib/python3.8/http/client.py", line 1256, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/local/lib/python3.8/http/client.py", line 1302, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/usr/local/lib/python3.8/http/client.py", line 1251, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/local/lib/python3.8/http/client.py", line 1011, in _send_output
    self.send(msg)
  File "/usr/local/lib/python3.8/http/client.py", line 951, in send
    self.connect()
  File "/usr/local/lib/python3.8/site-packages/urllib3/connection.py", line 205, in connect
    conn = self._new_conn()
  File "/usr/local/lib/python3.8/site-packages/urllib3/connection.py", line 186, in _new_conn
    raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x7f1cb4cebac0>: 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.8/site-packages/requests/adapters.py", line 439, in send
    resp = conn.urlopen(
  File "/usr/local/lib/python3.8/site-packages/urllib3/connectionpool.py", line 755, in urlopen
    retries = retries.increment(
  File "/usr/local/lib/python3.8/site-packages/urllib3/util/retry.py", line 574, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=5003): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f1cb4cebac0>: 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 "./request.py", line 3, in <module>
    resp = req.get("http://localhost:5003/")
  File "/usr/local/lib/python3.8/site-packages/requests/api.py", line 75, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/requests/api.py", line 61, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/requests/sessions.py", line 542, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python3.8/site-packages/requests/sessions.py", line 655, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/requests/adapters.py", line 516, in send
    raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=5003): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f1cb4cebac0>: Failed to establish a new connection: [Errno 111] Connection refused'))

Can not understand the problem. Thanks for help..

CodePudding user response:

How to fix

  • In your Dockerfile, ensure that you are running the Flask app by setting the FLASK_APP environment variable to the name of your app file ​(request.py in your case, default is app.py) and overriding the default port that Flask listens on:
ENV FLASK_APP=request.py
ENV FLASK_RUN_PORT=5003

CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]
  • Build your Docker container:
$ docker build -t request-example:latest .
  • Run your Docker image as a container, symmetrically exposing 5003 as the port for simplicity:
$ docker run -p 5003:5003 request-example:latest 
  • Test that the Flask app is now accessible on your local machine's localhost:
$ curl http://localhost:5003/
  • Or:
import requests as req

resp = req.get("http://localhost:5003/")

print(resp.text)

Suggestions

  • Create a requirements.txt that includes all your third-party libraries:
flask
requests
jsonify
  • Rewrite your Dockerfile to install whatever is in requirements.txt, rather than just the requests library:
FROM python:3.8

WORKDIR /request

COPY requirements.txt requirements.txt
COPY request.py request.py

RUN pip install -r requirements.txt

ENV FLASK_APP=request.py
ENV FLASK_RUN_PORT=5003

CMD [ "python", "-m" , "flask", "run", "--host=0.0.0.0"]
  • Related