Cannot import var from top package

103 Views Asked by At

This is my project structure:

myProject/
|
|-- src/
|   |-- services/
|   |   |-- __init__.py
|   |   |-- users.py
|   |   
|   |-- main.py
|   |-- ...
...

In main I have the mongo var that I need to use in users.py

# src/main.py

from flask import Flask
from flask_pymongo import PyMongo

import config
from services import api

app = Flask(__name__)

app.config["MONGO_URI"] = "mongodb://localhost:27017/myApp"
mongo = PyMongo(app)

api.init_app(app)


if __name__ == '__main__':
    app.run(host=config.HOST, port=config.PORT, debug=config.DEBUG)

in services init.py

# src/services/__init__.py
from flask_restx import Api
from .users import api as np_users
import config

api = Api(
    title=config.NAME,
    version=config.VERSION,
    description=config.DESCRIPTION,
)

api.add_namespace(np_users, path='/api/v1/users/users')

And I try to import mongo var in:

# src/services/users.py

     ...

from main import mongo

api = Namespace('users', description='users')
     ...

When I do:

python main.py

It throws me this error:

Traceback (most recent call last): File "main.py", line 7, in from services import api File "C:\myProject\src\services_init_.py", line 6, in from .users import api as ns_users File "C:\myProject\src\services\users.py", line 5, inices\users.py", line 5, in from main import mongo File "C:\myProject\src\main.py", line 7, in .py", line 7, in from services import api end_analisis_prediccion_equipos_b ImportError: cannot import name 'api' from 'services' (C:\myProject\src\services_init_.py)

1

There are 1 best solutions below

0
Melinda On BEST ANSWER

To be able to import mongo from main (main.py) you have to set the value of mongo before importing the api from service. Your main.py should be like:

from flask import Flask
from flask_pymongo import PyMongo
import config
app = Flask(__name__)
app.config["MONGO_URI"] = "mongodb://localhost:27017/myApp"

mongo = PyMongo(app)

from services import api 

api.init_app(app)

if __name__ == '__main__':
    app.run(host=config.HOST, port=config.PORT, debug=config.DEBUG)

Although this will work, using this pattern (from main import ...) it's not a good practice. You can check some explanations here.