Python ошибка циклического импорта с flask и сельдереем - PullRequest
0 голосов
/ 07 августа 2020

Как я могу сделать @ celery.task доступным в пакете ресурсов пользователя?

Я новичок в python и сбит с толку «ошибкой циклического импорта», может кто-нибудь объяснить, как это работает? и как обрабатывать подобные ошибки в приложении flask. Это та часть, где я всегда застреваю.

Это текущая структура папок моего проекта

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

--- ИСХОДНЫЙ КОД ---

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]

Ошибка:

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)
...