我一直在开发一款也有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。
答案 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
容器相同的容量。