2016-11-16 2 views
0

私はAPIを持ったFlask Adminアプリケーションを開発しています。アプリの一部には、呼び出されたときに電子メールを送信する関数が含まれていました。私は電子メールを送るためにセロリを使うべきだと言われました。以前のコードをCeleryを使ってFlask Adminでメールを送信する

CELERY_BROKER_URL = "redis://redis:6379/0" 

のinitの.py

celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL']) 
celery.conf.update(app.config) 

config.py:

は、私は、次のコードを追加 https://blog.miguelgrinberg.com/post/using-celery-with-flask

上のアドバイスに従っだった:

@app.route('/api/postupdate', methods=['POST']) 
@auth_token_required 
def post_update(): 
    if not request.json[0]: 
     return make_response(jsonify({'error': 'Request not in JSON'}), 400) 

    updates = [] 
    for entry in request.json: 
     updates.append({'trackingnumber':entry['trackingnumber'], 'date': datetime.strptime(entry['date'], '%Y-%m-%d %H:%M:%S'), \ 
       'status':entry['status'], 'location':entry['location']}) 
    send_email(updates) 
    return make_response(jsonify({'success': 'Update added'}), 200) 

は私がその後、def send_email()

の上に@celery.taskを追加send_email. delay(updates)

send_email(updates)から行を変更しかし、今、電子メールが送信されることはありません。トラブルシューティングを開始しようとしているところがどこにあるかわからない。エラーはスローされず、プログラムは成功したかのように継続します。

すべてが別々のドッカーコンテナにあります。ここに私のドッキングウィンドウのコンファイルは次のとおりです。

version: '2' 
services: 
    db: 
    image: postgres 
    environment: 
     - PG_PASSWORD=postgres 
    nginx: 
    image: nginx:latest 
    links: 
     - dev:uwsgi 
    ports: 
     - "80:80" 
     - "8080:8080" 
    volumes: 
     - ./x/nginx/nginx.conf:/etc/nginx/nginx.conf 
    redis: 
    image: redis 
    ports: 
     - "6379:6379" 
    dev: 
    build: ./x/ 
    volumes: 
     - ./x/app:/code/app 
    expose: 
     - "3031" 
    depends_on: 
     - db 
    links: 
     - redis 
    scraper: 
    build: ./Scraper/ 
    volumes: 
     - ./Scraper/scraper.py:/code/scraper.py 
     - ./Scraper/x.py:/code/x.py 
    depends_on: 
     - db 
     - dev 

アドバイスは、私は、以下の改正を行った受け取った後:

は、新たなサービスとして、ファイル・compose.yamlをドッキングウィンドウには、以下の

celery: 
    build: ./Worker/ 
    links: 
     - redis 
    volumes: 
     - ./x/app:/code/app 

実行を追加しました.SH:

celery worker -A app.celery 

新しいdockerfile:

FROM ubuntu:latest 
ENV TERM xterm 

RUN apt-get update -y && apt-get install -y python3-pip python3.5-dev  build-essential libpq-dev nano 

ADD ./requirements /code/requirements 
ADD run.sh /code/run.sh 

RUN pip3 install --upgrade pip 
RUN pip3 install -r /code/requirements/base.txt 

WORKDIR /code 
RUN chmod 777 run.sh 
CMD "./run.sh" 

これは、今、あなたのセットアップはRedisのによって管理キューに電子メールタスクを置くために、これまでに行われたものはコード1

答えて

0

ですぐに出セロリのサービスになりますが、あなたは実行されません。まだあなたの仕事。

youtタスクを実行するには、(タスクを実行するために)セロリのワーカープロセスを実行する場所に、追加のドッカーコンテナを実行する必要があります。セロリワーカーを実行する第二の端子に

:ブログ https://blog.miguelgrinberg.com/post/using-celery-with-flask 結論あなたがセロリワーカーを実行するには、次の命令を見つける前に、いくつかの行で

。これは、仮想環境にインストールされたセロリ コマンドで行います。

$ export MAIL_USERNAME= 
$ export MAIL_PASSWORD= 
$ source venv/bin/activate 
(venv) $ celery worker -A app.celery --loglevel=info 

新しいコンテナをリンクする必要があります。これは、電子メールを送信します プロセスであるので、MAIL_USERNAMEとMAIL_PASSWORD 環境変数は 労働者を開始する前に、有効なGmailアカウントに設定する必要がありますあなたのdevコンテナと同じ容積を含む必要があります。

+0

ありがとうございました。どのように私はそれを逃したか分からない。私はプログラムに加えた変更を加えるために質問を修正しました。これにより、セロリのサービスがコード0で直ちに終了します。セロリのサービスがどのように機能するのか、ちょっと混乱しています。 boto.sesとninjaのテンプレートを使用して電子メールを送信するには、コードにアクセスする必要がありますが、どこを探すべきかを知る方法がわかりません。 –

+0

'ls -rx/app'を投稿することができます –

+0

devコンテナ内から実行すると、次のようになります:' utilities.pyc utilities.py templates models email.pyc email.py config.py api.pyc api.py __pycache__ __init __。pyc __init__ .py' –

関連する問題