2017-04-25 1 views
0

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.

+0

'app.config [ 'CELERY_BROKER_URL']', du bist es den Zugriff auf nicht-Konfiguration geladen werden. – davidism

+0

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' –

Antwort

Verwandte Themen