Reputation: 697
I am using mongoengine to connect to mongo db from flask application and it gives me the following error message
raise ServerSelectionTimeoutError(
flask | pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused, Timeout: 30s, Topology Description: <TopologyDescription id: 6236fe25f46467df46971801, topology_type: Unknown, servers: [<ServerDescription ('localhost', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('localhost:27017: [Errno 111] Connection refused')
The code for flask is as
main.py
from flask import Flask
from decouple import config as con
from app.instance import config
from app.instance.exts import db
def create_app(config_class=config.Config):
app = Flask(__name__)
app.config.from_object(config.Config)
app.secret_key = con('flask_secret_key')
db.init_app(app)
from app.routes.test_route import test_api
app.register_blueprint(test_api)
return app
app = create_app()
if __name__ == "__main__":
# Only for debugging while developing
app.run(host="0.0.0.0", debug=True, port=80)
COnfiguration file is
instance/config.py
import os
from decouple import config
class Config:
MONGODB_SETTINGS = {"host":"mongodb://testuser:testuser@localhost:27017/ml-db"}
Extensions are
instance/exts.py
from flask_mongoengine import MongoEngine
db = MongoEngine()
Models view is
models/model.py
from app.instance.exts import db
class User(db.Document):
name = db.StringField()
email = db.StringField()
Route api view is
routes/test_route.py
from flask import Flask, render_template, Blueprint, jsonify
from app.models.model import User
test_api = Blueprint('test_api', __name__)
@test_api.route('/')
def testfn():
print("Request received")
User(name='laura', email='[email protected]').save()
return jsonify({"test":"success"})
docker-compose.yml
version: '3.8'
services:
web:
container_name: "flask"
build: ./
volumes:
- ./app:/app
ports:
- "8000:8000"
environment:
- DEPLOYMENT_TYPE=production
- FLASK_APP=app/main.py
- FLASK_DEBUG=1
- MONGODB_DATABASE=ml-db
- MONGODB_USERNAME=testuser
- MONGODB_PASSWORD=testuser
- MONGODB_HOSTNAME=mongo
command: gunicorn app.main:app --workers 4 --name main -b 0.0.0.0:8000
depends_on:
- mongo
links:
- mongo
nginx:
container_name: "nginx"
restart: always
image: nginx
volumes:
- ./app/nginx/conf.d:/etc/nginx/conf.d
ports:
- 80:80
- 443:443
links:
- web
mongo:
container_name: "mongo"
image: mongo:5-focal
restart: always
ports:
- '27017:27017'
environment:
MONGO_INITDB_ROOT_USERNAME: testuser
MONGO_INITDB_ROOT_PASSWORD: testuser
MONGO_INITDB_DATABASE: testdb
volumes:
- mongo-data:/data/db
- mongo-configdb:/data/configdb
volumes:
mongo-data:
mongo-configdb:
When I tried with a simple flask python program given below, Collection is created and document is inserted into the collection of mongo docker.
from flask import Flask
from flask_mongoengine import MongoEngine
app = Flask(__name__)
app.config['MONGODB_SETTINGS'] = {
'db': 'ml-db',
'username':'testuser',
'password':'testuser',
'host': 'localhost',
'port': 27017
}
db = MongoEngine()
db.init_app(app)
class User(db.Document):
name = db.StringField()
email = db.StringField()
User(name='laura', email='[email protected]').save()
if __name__ == "__main__":
app.run(debug=True)
Upvotes: 0
Views: 19