代码之家  ›  专栏  ›  技术社区  ›  Mohamed Abdillah

如何解决芹菜文件中带有关键字参数namespace='“芹菜”错误的芹菜工作程序配置

  •  0
  • Mohamed Abdillah  · 技术社区  · 7 年前

    我有一个项目名为ShippingApp,我按照步骤设置芹菜工人。我正在使用芹菜3.1.26.post2和python3.7,当我想启动芹菜工人,我得到以下错误:

    E:\ShippingApp>celery -A ShippingApp worker -l info
    Traceback (most recent call last):
      File "c:\program files\python37\lib\runpy.py", line 193, in _run_module_as_main
        "__main__", mod_spec)
      File "c:\program files\python37\lib\runpy.py", line 85, in _run_code
        exec(code, run_globals)
      File "C:\Program Files\Python37\Scripts\celery.exe\__main__.py", line 9, in <module>
      File "c:\program files\python37\lib\site-packages\celery\__main__.py", line 30, in main
        main()
      File "c:\program files\python37\lib\site-packages\celery\bin\celery.py", line 81, in main
        cmd.execute_from_commandline(argv)
      File "c:\program files\python37\lib\site-packages\celery\bin\celery.py", line 793, in execute_from_commandline
        super(CeleryCommand, self).execute_from_commandline(argv)))
      File "c:\program files\python37\lib\site-packages\celery\bin\base.py", line 309, in execute_from_commandline
        argv = self.setup_app_from_commandline(argv)
      File "c:\program files\python37\lib\site-packages\celery\bin\base.py", line 469, in setup_app_from_commandline
        self.app = self.find_app(app)
      File "c:\program files\python37\lib\site-packages\celery\bin\base.py", line 489, in find_app
        return find_app(app, symbol_by_name=self.symbol_by_name)
      File "c:\program files\python37\lib\site-packages\celery\app\utils.py", line 235, in find_app
        sym = symbol_by_name(app, imp=imp)
      File "c:\program files\python37\lib\site-packages\celery\bin\base.py", line 492, in symbol_by_name
        return symbol_by_name(name, imp=imp)
      File "c:\program files\python37\lib\site-packages\kombu\utils\__init__.py", line 96, in symbol_by_name
        module = imp(module_name, package=package, **kwargs)
      File "c:\program files\python37\lib\site-packages\celery\utils\imports.py", line 101, in import_from_cwd
        return imp(module, package=package)
      File "c:\program files\python37\lib\importlib\__init__.py", line 127, in import_module
        return _bootstrap._gcd_import(name[level:], package, level)
      File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
      File "<frozen importlib._bootstrap>", line 983, in _find_and_load
      File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
      File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
      File "<frozen importlib._bootstrap_external>", line 728, in exec_module
      File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
      File "E:\ShippingApp\ShippingApp\__init__.py", line 2, in <module>
        from .celery import app as celery_app
      File "E:\ShippingApp\ShippingApp\celery.py", line 6, in <module>
        app.config_from_object('django.conf:settings', namespace='CELERY')
    TypeError: config_from_object() got an unexpected keyword argument 'namespace'
    

    芹菜.py:

    import os
    from celery import Celery
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
    
    app = Celery('mysite')
    app.config_from_object('django.conf:settings', namespace='CELERY')
    app.autodiscover_tasks()
    

    初始 .py:

    from .celery import app as celery_app
    

    任务.py:

    from celery import task
    from django.core.mail import send_mail
    from .models import Order
    @task
    def order_created(order_id):
        """
        Task to send an e-mail notification when an order is
        successfully created.
        """
        order = Order.objects.get(id=order_id)
        subject = 'Order nr. {}'.format(order.id)
        message = 'Dear {},\n\nYou have successfully placed an order.\
        Your order id is {}.'.format(order.first_name,
        order.id)
        mail_sent = send_mail(subject,
                            message,
                            'admin@myshop.com',
        [order.email])
        return mail_sent
    

    在“订单”视图中,我们有以下代码:

    def order_create(request):
    cart = Cart(request)
    if request.method == 'POST':
        form = OrderCreateForm(request.POST)
        if form.is_valid():
            order = form.save()
            for item in cart:
                OrderItem.objects.create(order=order,
                                        product=item['product'],
                                        price=item['price'],
                                        quantity=item['quantity'])
            # clear the cart
            cart.clear()
            # launch asynchronous task
            order_created.delay(order.id)
            # set the order in the session
            request.session['order_id'] = order.id
            # redirect for payment
            return redirect(reverse('payment:process'))
    else:
        form = OrderCreateForm()
    return render(request,
                'orders/order/create.html',
                {'cart': cart, 'form': form})
    

    在我使用芹菜4.2.1之前,它与windows 10不兼容,我卸载它并安装3.1.26.post2版本。 请协助。

    0 回复  |  直到 7 年前
        1
  •  6
  •   TechSavy    7 年前

    大写名称空间意味着所有芹菜配置必须以大写而不是小写指定,并以 芹菜_ ,例如, 任务总是迫不及待 设置变成 芹菜任务总是 ,以及 代理url 变成 芹菜经纪人网址 等等。此配置是从芹菜4.0以后引入的。

    因此,对于版本<4,您不需要 namespace 排队:

    app.config_from_object('django.conf:settings', namespace='CELERY')

    将上述内容替换为:

    app.config_from_object('django.conf:settings')

    注: 如果您使用芹菜3.1,请检查您的Django版本。应该是<1.8