代码之家  ›  专栏  ›  技术社区  ›  Little Phild

芹菜+Django不能同时使用

  •  2
  • Little Phild  · 技术社区  · 6 年前

    我有 Django 2.0 工作正常的项目,其与 Celery 4.1.0 ,我使用jquery将ajax请求发送到后端,但由于芹菜的一些问题,我才意识到它的加载是无休止的。

    芹菜设置(芹菜.py)

    from __future__ import absolute_import, unicode_literals
    import os
    from celery import Celery
    
    # set the default Django settings module for the 'celery' program.
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'converter.settings')
    
    app = Celery('converter', backend='amqp', broker='amqp://guest@localhost//')
    
    # Using a string here means the worker doesn't have to serialize
    # the configuration object to child processes.
    # - namespace='CELERY' means all celery-related configuration keys
    #   should have a `CELERY_` prefix.
    app.config_from_object('django.conf:settings', namespace='CELERY')
    
    # Load task modules from all registered Django app configs.
    app.autodiscover_tasks()
    
    @app.task(bind=True)
    def debug_task(self):
        print('Request: {0!r}'.format(self.request))
    

    芹菜任务(Tasks.py)

    from __future__ import absolute_import, unicode_literals
    
    from celery import shared_task
    
    @shared_task(time_limit=300)
    def add(number1, number2):
        return number1 + number2
    

    Django视图(views.py)

    class AddAjaxView(JSONResponseMixin, AjaxResponseMixin, View):
        def post_ajax(self, request, *args, **kwargs):
            url = request.POST.get('number', '')
            
            task = tasks.convert.delay(url, client_ip)
            result = AsyncResult(task.id)
    
            data = {
                'result': result.get(),
                'is_ready': True,
            }
            if result.successful():
                return self.render_json_response(data, status=200)
    

    当我向Django应用程序发送ajax请求时,它会无休止地加载,但当终止Django服务器时,我会运行 celery -A demoproject worker --loglevel=info 这就是我的任务正在运行的时候。

    问题 我如何使其自动化,以便在运行Django项目时,当我发送ajax请求时,芹菜任务将自动工作?

    1 回复  |  直到 4 年前
        1
  •  2
  •   SK. Fazlee Rabby    6 年前

    如果您在开发环境中,则必须手动运行celery worker,因为它不会在后台自动运行,以便处理队列中的作业。因此,如果您想拥有一个完美的工作流,那么您需要同时运行Django默认服务器和芹菜worker。如文件所述:

    在生产环境中,您希望在后台将worker作为守护程序运行(请参阅Daemonization),但对于测试和开发,能够使用celery worker manage命令启动worker实例非常有用,就像使用Djangos manage一样。py runserver: celery -A proj worker -l info

    您可以阅读他们的文档以进行后台监控。

    http://docs.celeryproject.org/en/latest/userguide/daemonizing.html