Flask后端实践 连载十九 Flask工厂模式集成使用Celery

Flask后端实践 连载十九 Flask工厂模式集成使用Celery

tips:

  • 讲解Flask与Celery结合使用中遇到的各种问题解决方法
  • 本文基于python3编写
  • 代码仓库

项目场景

项目上有许多任务需要在后台处理,虽然可以使用异步线程来解决,但是无法及时获取到任务执行状态,有时任务执行失败,也无法及时获取到关键信息。
因此,采用Celery来重写相关的异步任务,方便管理和处理错误信息。

前置条件

  • 安装Celery pip install celery==4.3.0
  • 安装Flask pip install flask==1.0.3
  • 安装redis pip install redis==3.2.1

Flask与Celery结合简单使用

  • 新建celery_app.py
    from celery import Celery
    
    redis_config='redis://127.0.0.1:6379/0'
    celery_app = Celery(__name__, backend=redis_config, broker=redis_config)
    
    
    @celery_app.task
    def async_add(x, y):
        return x + y
    
    
  • 新建flask_app.py
    from flask import Flask
    from celery_app import async_add
    
    flask_app = Flask(__name__)
    @flask_app.route('/test', methods=["GET"])
    def test_add():
        """
        测试相加
        :return:
        """
        result = async_add.delay(1, 2)
        return str(result.get(timeout=1))
    
    if __name__ == '__main__':
        flask_app.run()
    
    
  • 启动
    • windows shell中celery -A celery_app worker --pool=solo -l info
    • Linux shell中celery -A celery_app worker -l info
    • 启动Flask APP python flask_app.py
  • 测试
    • 访问http://127.0.0.1:5000/test 返回 3

工厂模式下Flask与Celery结合

  • 文件目录结构

    _
     |_ app
     |  |_ __init__.py # 工程函数
     |  |_ api.py  # API接口
     |  |_ celery.py # celery及tasks
     |  
     |_ run.py # 启动Flask APP
    
    
  • 编写celery.py

    from celery import Celery
    from flask import current_app
    
    celery_app = Celery(__name__)
    
    
    @celery_app.task
    def add(x, y):
        """
        加法
        :param x:
        :param y:
        :return:
        """
        return str(x + y)
    
    
    @celery_app.task
    def flask_app_context():
        """
        celery使用Flask上下文
        :return:
        """
        with current_app.app_context():
            return str(current_app.config)
    
    
  • 编写__init__.py

    from flask import Flask
    from .celery import celery_app
    
    
    def create_app():
        app = Flask(__name__)
    
        celery_app.conf.update({"broker_url": 'redis://127.0.0.1:6379/0',
                                "result_backend": 'redis://127.0.0.1:6379/0', })
        from .api import bp
    
        app.register_blueprint(bp)
        return app
    
    
  • 编写api.py

    from flask import Blueprint
    from .celery import add, flask_app_context
    
    bp = Blueprint("test", __name__, url_prefix='/')
    
    
    @bp.route('/testAdd', methods=["GET"])
    def test_add():
        """
        测试相加
        :return:
        """
        result = add.delay(1, 2)
        return result.get(timeout=1)
    
    
    @bp.route('/testFlaskAppContext', methods=["GET"])
    def test_flask_app_context():
        """
        测试相加
        :return:
        """
        result = flask_app_context.delay()
        return result.get(timeout=1).replace('<Config', '')
    
  • 编写run.py

    from app import create_app,celery_app
    
    app = create_app()
    # 关键点,往celery推入flask信息,使得celery能使用flask上下文
    app.app_context().push()
    
    
    if __name__ == '__main__':
        app.run()
    
    
    
  • 启动

    • windows shell中输入celery -A run:celery_app worker --pool=solo -l info
    • Linux shell中输入celery -A run:celery_app worker -l info
    • 启动Flask APP python run.py
  • 测试

    • 访问http://127.0.0.1:5000/testAdd 返回 3
    • 访问http://127.0.0.1:5000/testFlaskAppContext 返回 Flask配置信息

总结

  • 本片文章主要解决了新版本的Celery使用Flask上下文的功能
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
在Windows上使用Flask启动Cel在Windows上使用Flask启动Celery时,可能会遇到一些报错。以下是一些常见的解决方法: ery时,可能会遇到一些报错。以下是一些常见的解决方法: 1. 确保已正确安装CeleryFlask-Celery扩展。可以使用以下命令进行安装: ```shell pip install celery pip install Flask-Celery ```1. 确保已正确安装CeleryFlask-Celery扩展。可以使用以下命令进行安装: ```shell pip install celery pip install Flask-Celery ``` 2. 确保已正确配置Celery。在Flask应用程序的主文件中,需要进行Celery的配置,例如: ```python from flask import Flask from celery import Celery app 2. 确保已正确配置Celery。在Flask应用程序的主文件中,需要进行Celery的配置,例如: ```python = Flask(__name__) from flask import Flask app.config['from celery import CeleryCELERY_B app = FlaskROKER_URL'] = '(__name__) app.config['redis://localhostCELERY_BROKER_URL'] = 'redis://localhost:6379/0' app.config['CELERY:6379_RESULT_BACKEND'] =/0' 'app.configredis://['localhost:637CELERY_RESULT9/0_BACKEND'] =' celery 'redis://localhost:637 = Celery(app.name,9/0 broker=app.config' cel['CELeryERY_BRO = CeleryKER_URL']) (app.name,celery.conf broker=app.update(app.config.config['CELERY_BRO) ```KER_URL']) celery.conf.update(app.config) ``` 3. 确保已正确导入任务函数。在Flask应用程序中,需要导入任务函数并调用`delay()`方法来异步执行任务,例如: ```python from yourapp.tasks import send_password_reset_email @app.route('/reset_password') def reset 3. 确保已正确导入任务函数。在Flask应用程序中,需要导入任务函数并调用`delay()`方法来异步执行任务,例如: ```python _password(): # 调用from yourapp任务函数 .tasks import send send_password_password_reset_email_reset_email.delay(user) @app.route return 'Password('/reset_password') def reset reset email sent_password(): # 调用!' 任务函数 ``` send_password_reset_email.delay(user) return 'Password reset email sent 4. 确保已正确启动Celery worker。在命令行中,使用以下命令启动Celery worker: ```shell celery -A yourapp.tasks worker!' ``` --loglevel=info ``` 4. 确保已正确启动Celery worker。在命令行中,使用以下命令启动Celery worker: ```shell celery -A yourapp.tasks worker --loglevel=info ``` 如果仍然遇到报错,请提供具体的报错信息,以便更好地帮助您解决问题。 如果仍然遇到报错,请提供具体的报错信息,以便更好地帮助您解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值