I have already visited several questions in the community, but I believe this is my fault because I was unable to identify an adequate way, in the use of the factory architecture pattern indicate in documentation Flask.
We have an application, based on Flask + Gunicorn + Nginx, that always worked without major challenges. However, we need to build a solution that requires asynchronous tasks. Soon the indication was unanimous, to use Celery for this, but even following the style used here.
I can't make the project compile because it informs that there are import errors and the official documentation of the framework does not bring much clarity on how to use it, in the structure factory, just how to do it in single instance.
How can I solve this?
My traceback:
File "/home/user/Workspace/test/project_async/celery_runner.py", line 3, in <module>
from app import create_app
File "/home/user/Workspace/test/project_async/app/__init__.py", line 9, in <module>
from .api import configure as config_api
File "/home/user/Workspace/test/project_async/app/api.py", line 3, in <module>
from .resources.chosen import Change
File "/home/user/Workspace/test/project_async/app/resources/chosen.py", line 5, in <module>
from app.jobs.tasks import exec_change as tk_change
File "/home/user/Workspace/test/project_async/app/jobs/tasks.py", line 1, in <module>
from app import celery
ImportError: cannot import name 'celery' from 'app' (/home/user/Workspace/test/project_async/app/__init__.py)
My structure:
.
├── app
│ ├── api.py
│ ├── jobs
│ │ ├── celeryconfig.py
│ │ ├── __init__.py
│ │ └── tasks.py
│ ├── jwt.py
│ ├── models
│ │ ├── core.py
│ │ ├── __init__.py
│ │ ├── inventory.py
│ │ └── other.py
│ ├── resources
│ │ ├── chosen.py
│ │ └── __init__.py
│ ├── schemas.py
│ ├── services
│ │ ├── chosen.py
│ │ ├── base.py
│ │ ├── chosen_other.py
│ │ └── inventory.py
│ ├── static
│ │ ├── swagger.json
│ │ └── swagger.yaml
│ ├── swagger.py
│ └── utils.py
├── celery_runner.py
├── config.py
├── main.py
├── test.log
└── tests
├── __init__.py
└── test_inventory.py
Code:
path - app/__init__.py
from flask import Flask
from flask_cors import CORS
from flask_migrate import Migrate
from config import configure as config_project
from .api import configure as config_api
from .jwt import configure as config_jwt
from .models.core import configure as config_db
from .models.inventory import configure as config_db_mongo
from .swagger import configure as config_docs
from celery import Celery
celery = Celery(__name__)
def create_app(config_name):
app = Flask(__name__)
'''Added Configurations'''
config_project(app)
config_jwt(app)
config_api(app)
config_docs(app)
config_db(app)
config_db_mongo(app)
'''Added Thirds'''
CORS(app)
Migrate(app, app.db)
'''Background Tasks'''
celery.conf.update(app.config)
celery.config_from_object('app.jobs.celeryconfig')
return app
path - project_async/celery_worker.py
from dotenv import find_dotenv, load_dotenv
from app import create_app
load_dotenv(find_dotenv())
app = create_app(getenv('FLASK_ENV') or 'default')
app.app_context().push()
path - app/jobs/celeryconfig.py
broker_url = 'redis://localhost:6379/1'
result_backend = 'redis://localhost:6379/0'
# import
imports = 'app.jobs.tasks'
# Timezone
timezone = 'America/Bogota'
enable_utc = True
path - app/jobs/tasks.py
from app import celery
from app.services.chosen_other import ChangeOpportunity
@celery.task(name='tasks.change')
def exec_change(data, change, client):
change = ChangeOpportunity(data, change, client)
change.execute_change()
Aucun commentaire:
Enregistrer un commentaire