2

How can I make @celery.task available on user resources package?

I'm new to python and confused about the "circular imports error" can somebody explain how it works? and how to handle this kind of errors in flask application. This is the part where I always get stuck.

This is my project current folder structure

code
|_resources
| |_user.py
|
|_utils
| |_flask_celery.py
|
|_flask_app.py

--- SOURCE CODE ---

flask_app.py

from flask import Flask
from flask_cors import CORS
from flask_restful import Api
from util.flask_celery import make_celery
from routes.endpoint import urls
from resources.user import Users


app = Flask(__name__)
CORS(app, resources={r"/*": {"origins": "*"}})
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql:///username:StrongPassword@localhost:3306/db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['CELERY_BROKER_URL'] = 'amqp//admin:StrongPassword@localhost:5672'
app.config['CELERY_RESULT_BACKEND'] = 'db+mysql:///username:StrongPassword@localhost:3306/db'
app.config['PROPAGATE_EXCEPTIONS'] = True
api = Api(app)
celery = make_celery(app)
url = urls()


api.add_resource(Users, url.get('users'))

if __name__ == "__main__":
    # sqlalchemy
    from db import db

    db.__init__(app)
    app.run(host='0.0.0.0', debug=True, port=5000)

flask_celery.py

from celery import Celery


def make_celery(celery_app):
    celery = Celery(
        celery_app.import_name,
        backend=celery_app.config['CELERY_RESULT_BACKEND'],
        broker=celery_app.config['CELERY_BROKER_URL']
    )
    celery.conf.update(celery_app.config)

    class ContextTask(celery.Task):
        def __call__(self, *args, **kwargs):
            with celery_app.app_context():
                return self.run(*args, **kwargs)

    celery.Task = ContextTask
    return celery

user.py

from flask_restful import Resource, reqparse
from app import celery # <-- this cause the error
from util.zk_connector import zk_connect
from util.zk_error import error


class Users(Resource):
    def post(self, ip, comkey):
        zk = zk_connect(ip=ip, password=int(comkey))
        try:
            session = zk.connect()

            session.disable_device()
            users = session.get_users()

            print(users)

            session.enable_device()
            session.disconnect()

            return {'message': 'success'}, 200
        except Exception as e:
            return error(e)

@celery.task(name='user.reverse')
def reverse(string):
    return string[::-1]

Error:

Traceback (most recent call last):
  File ".\flask_app.py", line 6, in <module>
    from resources.user import User
  File "C:\Users\Gelo\Documents\Brand new clean arch pyzk\code\resources\user.py", line 2, in <module>
    from flask_app import celery
  File "C:\Users\Gelo\Documents\Brand new clean arch pyzk\code\flask_app.py", line 6, in <module>
    from resources.user import User
ImportError: cannot import name 'User' from partially initialized module 'resources.user' (most likely due to a circular import) (C:\Users\Gelo\Documents\Brand new clean arch pyzk\code\resources\user.py)
Gelo
  • 23
  • 5

0 Answers0