首页 > 解决方案 > Django Celery:TypeError:“NoneType”对象不可迭代

问题描述

我正在添加django-celery到我的项目中,目前您会遇到一个问题,即第一次安装它会安装一个过时的celery,您需要更新它,并且它有一个依赖项django-celery-results,每个依赖项都有它的预期版本,具体取决于它的版本。我最终得到了以下版本

Name: django-celery-results
Version: 1.0.0

Name: django-celery
Version: 3.3.1

Name: celery
Version: 4.4.0

在我的 app/tasks.py 我有以下代码

from celery import shared_task
from django.conf import settings

@shared_task
def update_extend():
    users = User.objects.filter(is_active=True)
    for user in users:
        ....

根据文档,这似乎是要测试的下一行代码

(fortnox) sam@sam:/media/veracrypt1/fortnox$ python manage.py celery
Traceback (most recent call last):
File "manage.py", line 21, in <module>
    main()
File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
File "/home/sam/code/envs/fortnox/lib/python3.6/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
File "/home/sam/code/envs/fortnox/lib/python3.6/site-packages/django/core/management/__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/sam/code/envs/fortnox/lib/python3.6/site-packages/django/core/management/__init__.py", line 244, in fetch_command
    klass = load_command_class(app_name, subcommand)
File "/home/sam/code/envs/fortnox/lib/python3.6/site-packages/django/core/management/__init__.py", line 37, in load_command_class
    module = import_module('%s.management.commands.%s' % (app_name, name))
File "/home/sam/code/envs/fortnox/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 678, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/home/sam/code/envs/fortnox/lib/python3.6/site-packages/djcelery/management/commands/celery.py", line 11, in <module>
    class Command(CeleryCommand):
File "/home/sam/code/envs/fortnox/lib/python3.6/site-packages/djcelery/management/commands/celery.py", line 16, in Command
    tuple(base.get_options()) +
TypeError: 'NoneType' object is not iterable

这会引发上面显示的错误。

标签: djangocelerydjango-celery

解决方案


django-celery不支持高于 Django 1.10.* 的 Django 版本也不支持celery 4.*.*

来自Django 的 Celery 文档

以前版本的 Celery 需要一个单独的库来与 Django 一起工作,但从 3.1 开始不再是这种情况。现在支持开箱即用的 Django,因此本文档仅包含集成 Celery 和 Django 的基本方法。您将使用与非 Django 用户相同的 API,因此建议您先阅读 Celery 的第一步教程,然后再返回本教程。当您有一个工作示例时,您可以继续阅读后续步骤指南。

您仍然可以使用django-celery-results但不需要 djcelery


推荐阅读