Ich versuche, Sellerie in einer App zu verwenden, um lange Aufgaben asynchron auszuführen.Flask and Sellery große Anwendungsstruktur
Im oberen Projektordner Ich habe application.py:
from flask_stormpath import StormpathManager
from app import create_app
from celery import Celery
app = create_app('DevelopmentConfig')
stormpath_manager = StormpathManager(app)
celery = Celery(app.name, broker=app.config.from_object('CELERY_BROKER_URL'))
celery.conf.update(app.config)
if __name__ == '__main__':
app.run()
Die config.py sieht wie folgt aus:
class Config:
SECRET_KEY = 'something_very_secret'
broker_url = 'sqs://'
broker_transport_options = {'region': 'eu-west-1',
'visibility_timeout': 3600,
'polling_interval': 0.3,
'queue_name_prefix': 'celery-'}
csrf = SECRET_KEY
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis: //localhost:6379/0'
@staticmethod
def init_app(app):
pass
class DevelopmentConfig(Config):
JUST_SOMETHING = 'a_little_trick'
DEBUG = True
STORMPATH_API_KEY_FILE = '/.stormpath/apiKey.properties'
STORMPATH_APPLICATION = 'flask-test'
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis: //localhost:6379/0'
class ProductionConfig(Config):
JUST_SOMETHING = 'a_little_trick'
DEBUG = True
STORMPATH_API_KEY_FILE = '/.stormpath/apiKey.properties'
STORMPATH_APPLICATION = 'flask-test'
CELERY_BROKER_URL = 'sqs://'
config = {'development': DevelopmentConfig,
'default': DevelopmentConfig}
und in meinem views.py ich versuchen, eine Aufgabe auszuführen:
from flask import render_template, flash, request, jsonify, Response
from wtforms import Form, validators, SelectMultipleField, widgets
from flask_stormpath import login_required
from . import main
import numpy as np
class MultiCheckboxField(SelectMultipleField):
widget = widgets.ListWidget(prefix_label=False)
option_widget = widgets.CheckboxInput()
@celery.task(bin=True)
def do_something(test, training_size, testing_size):
Jetzt, wenn ich es so laufen lasse, bekomme ich die Nachricht, dass @ sellery.task der Name Sellerie nicht definiert wurde. Ein guter Punkt, also habe ich ihn in @ main.celery.task geändert. Wenn ich das tue, erhalte ich die Fehlermeldung „Attribute:‚Blueprint‘Objekt kein Attribut‚Sellerie‘hat
Dann habe ich versucht Sellerie in der init Py-Datei zu starten.
from flask import Flask
from celery import Celery
def create_app(config_name):
app = Flask(__name__)
configuration = "config."+config_name
app.config.from_object(configuration)
celery = Celery(app.name, broker=app.config.from_object('CELERY_BROKER_URL'))
celery.conf.update(app.config)
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
return app
wenn ich das tue, erhalte ich die Fehlermeldung: Import: kein Modul mit dem Namen CELERY_BROKER_URL
also, ich weiß nicht, wo Sellerie importieren und zu initiieren und wie ein Plan zu erstellen, so dass ich celery.task in Ansichten verwenden kann .py. Jede Hilfe würde sehr geschätzt werden.
'app.config [ 'CELERY_BROKER_URL']', du bist es den Zugriff auf nicht-Konfiguration geladen werden. – davidism
Zunächst sollten Sie alle Sellerie Aufgaben in einem "Modul" bewegen. 'Sellerie = Sellerie (...)' sollte Initialisierung in Ihrem Modul mit Aufgaben, aber nicht in 'def create_app' –