meai2312
meai2312

Reputation: 317

Python Flask factory application problem with Flask-Mqtt has no attribute 'init_app'

I struggle with the implementation of the Flask-MQTT lib to my app. SQLAlchemy etc works fine, but flask-mqtt throws the error AttributeError: module 'app.mqtt' has no attribute 'init_app'.

In the offical documentatio of Flask-MQTT they build up the create_app() Method the same way ( https://flask-mqtt.readthedocs.io/en/latest/usage.html )

Would be greate if someone can help me! Thank you very much

__init__.py

from flask import Flask
from flask_restful import Api
from flask_mqtt import Mqtt
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
from flask_jwt_extended import JWTManager

mqtt = Mqtt()
api = Api()
db = SQLAlchemy()
ma = Marshmallow()
jwt = JWTManager()

def create_app(config):
    app = Flask(__name__)
    app.config.from_object(config.DevelopmentConfig)

    mqtt.init_app(app)
    db.init_app(app)
    api.init_app(app)
    ma.init_app(app)
    jwt.init_app(app)

    return app

from app.mqtt import mqttclient

run.py

from app import create_app
import config
from flask_migrate import Migrate

app = create_app(config)
migrate = Migrate(app, db)

app.config['MQTT_BROKER_URL'] = 'hivemq'
app.config['MQTT_BROKER_PORT'] = 1883
app.config['MQTT_USERNAME'] = ''
app.config['MQTT_PASSWORD'] = ''
app.config['MQTT_KEEPALIVE'] = 5
app.config['MQTT_TLS_ENABLED'] = False


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5003, threaded=True)

ERROR:

mqttservice    | Traceback (most recent call last):
mqttservice    |   File "run.py", line 5, in <module>
mqttservice    |     app = create_app(config)
mqttservice    |   File "/code/app/__init__.py", line 18, in create_app
mqttservice    |     mqtt.init_app(app)
mqttservice    | AttributeError: module 'app.mqtt' has no attribute 'init_app'

Upvotes: 2

Views: 440

Answers (1)

Dave W. Smith
Dave W. Smith

Reputation: 24966

In that code fragment, mqtt has two meanings. The first is the variable assigned in

mqtt = Mqtt()

The second is a namespace (module)

from app.mqtt import mqttclient

The tell is in the error

AttributeError: module 'app.mqtt' has no attribute 'init_app'

which is happening because the import is overwriting the initial value, so by the time of that .init_app(), mqtt isn't what you expected.

You're going to have to change one of those names.

Upvotes: 1

Related Questions