使用Celery在Flask Admin

时间:2016-11-16 15:15:19

标签: python celery

我一直在开发一款也有API的Flask Admin应用。该应用程序的一部分包括一个在调用时发送电子邮件的功能。我被告知我应该使用芹菜来发送电子邮件。

我按照https://blog.miguelgrinberg.com/post/using-celery-with-flask

的建议

我添加了以下代码:

config.py:

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

初始化的.py

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

以前的代码是:

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

我将行从send_email(updates)更改为send_email. delay(updates)

然后我在@celery.task

之上添加了def send_email()

但是,现在,电子邮件从未发送过。我甚至不确定从哪里开始尝试进行故障排除。不会抛出任何错误,程序会继续,就像它成功一样。

一切都在单独的docker容器中。这是我的docker撰写文件:

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

收到建议后,我做了以下修改:

将以下内容添加到docker-compose.yaml文件中作为新服务

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

run.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"

现在,这会导致芹菜服务立即退出代码1。

1 个答案:

答案 0 :(得分:0)

到目前为止,您的设置是将您的电子邮件任务放在由redis管理的队列中,但您还没有执行任务。

要执行你的任务,你需要运行一个额外的docker容器来运行celery worker进程(执行任务)!

在博客中 https://blog.miguelgrinberg.com/post/using-celery-with-flask结论之前的一些行,您会找到以下指令来运行芹菜工作者:

  

在第二个终端上运行Celery工作人员。这是用芹菜做的   命令,安装在虚拟环境中。既然这是   将发送电子邮件的进程,MAIL_USERNAME和MAIL_PASSWORD   在开始之前,必须将环境变量设置为有效的Gmail帐户   工人:

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

您的新容器必须链接到redis容器,并且必须包含与dev容器相同的容量。