使用uwsgi运行flask app和celery - All About Free

之前使用了uwsgi来单独启动flask, 然后再手动启动celery, 但是这样做着实有点麻烦, 伴随着公司今后多景区的接入, 运维成本就会越来越大, 所以尝试对uwsgi和项目结构做一些调整, 利用uwsgi直接启动celery, 并且将celery的代码转移回项目中, 做到一个景区对应一个celery队列, 而不再多景区共享celery.

首先对vassal配置文件进行修改, 借用uwsgi的smart-attach-daemon, 我们可以轻松的做到启动celery, 只需要加一句


smart-attach-daemon = /tmp/celery_%(vassal_name).pid celery -A application.tasks worker --pidfile=/tmp/celery_%(vassal_name).pid


但是修改完以后就出现了如下错误 AttributeError: ‘Flask’ object has no attribute ‘user_options’, 进行搜索后发现

The your_application string has to point to your application’s package or module that creates the celery object.

可问题就是application.tasks的确就是生成celery的module, 于是想说尝试直接指向生成的celery object试试效果, 既修改vassal配置为


smart-attach-daemon = /tmp/celery_%(vassal_name).pid celery -A application.tasks.celery_app worker --pidfile=/tmp/celery_%(vassal_name).pid


上传更新后发现居然正常了, 重新排查原因, 原来是我在application.tasks中将application.flask_app定义成了app, 而celery会默认寻找app这个对象作为celery的对象, 所以才会出现启动celery时候出现Flask的错误.

Free /
Published under (CC) BY-NC-SA in categories technology