2017-04-25 9 views
0

長いタスクを非同期で実行するために、アプリでセロリを使用しようとしています。私が持っている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() 

config.pyは次のようになります。

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} 

、私のviews.pyに私は、タスクを実行しよう:

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

今のように実行すると、@ celery.taskという名前のセロリが定義されていないというメッセージが表示されます。私はそれを@ main.celery.taskに変更しました。私はこれを行うと、私はエラーメッセージ「はAttributeErrorを取得: 『青写真』オブジェクトが属性 『セロリ』を持っていない

その後、私はのinitの.pyファイルにセロリを開始しようとした:。

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 

ImportError:CELERY_BROKER_URLという名前のモジュールがありません

セロリをインポートして開始する場所と、どこでcelery.taskをビューで使用できるように青写真を作成するかはわかりません.py。どんな助けも高く評価されるでしょう。

+0

'app.configを[ 'CELERY_BROKER_URL']'は、設定をロードしていない、それをアクセスしています。 – davidism

+0

まず、すべてのセロリのタスクを1つの 'module'に移動する必要があります。 'celery = Celery(...)'はあなたのモジュールでタスクを初期化する必要がありますが、 'def create_app'では初期化されません。 –

答えて

0

それを見てみんなに感謝します。後でapp_context()と一緒にトラブルを引き起こす多くの間違いがありました。

私は非常によく構造を概説しており、ここにこの記事を追いました。

http://shulhi.com/celery-integration-with-flask/

関連する問題