django配合celery/celery_beat/celery_results使用,migrate时出现时区错误ZoneInfoNotFoundError

celery: 简单、灵活、可靠的分布式定时任务库
django_celery_results: 存储celery执行结果的库
Django_celery_beat: 周期性定时任务库
安装依赖
poetry add celery django_celery_results django_celery_beat

报错如下

❯ python manage.py migrate django_celery_beat
Traceback (most recent call last):
  File "/usr/local/Cellar/python@3.10/3.10.5/Frameworks/Python.framework/Versions/3.10/lib/python3.10/zoneinfo/_common.py", line 12, in load_tzdata
    return importlib.resources.open_binary(package_name, resource_name)
  File "/usr/local/Cellar/python@3.10/3.10.5/Frameworks/Python.framework/Versions/3.10/lib/python3.10/importlib/resources.py", line 46, in open_binary
    return reader.open_resource(resource)
  File "/usr/local/Cellar/python@3.10/3.10.5/Frameworks/Python.framework/Versions/3.10/lib/python3.10/importlib/abc.py", line 433, in open_resource
    return self.files().joinpath(resource).open('rb')
  File "/usr/local/Cellar/python@3.10/3.10.5/Frameworks/Python.framework/Versions/3.10/lib/python3.10/pathlib.py", line 1119, in open
    return self._accessor.open(self, mode, buffering, encoding, errors,
FileNotFoundError: [Errno 2] No such file or directory: '/Users/xxx/Work/projects/xiaomi/ibn-quality/ibn-quality-be/.venv/lib/python3.10/site-packages/tzdata/zoneinfo/Asia/Hanoi'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/xxx/Work/projects/xiaomi/ibn-quality/ibn-quality-be/manage.py", line 22, in <module>
    main()
  File "/Users/xxx/Work/projects/xiaomi/ibn-quality/ibn-quality-be/manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/Users/xxx/Work/projects/xiaomi/ibn-quality/ibn-quality-be/.venv/lib/python3.10/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line
    utility.execute()
  File "/Users/xxx/Work/projects/xiaomi/ibn-quality/ibn-quality-be/.venv/lib/python3.10/site-packages/django/core/management/__init__.py", line 420, in execute
    django.setup()
  File "/Users/xxx/Work/projects/xiaomi/ibn-quality/ibn-quality-be/.venv/lib/python3.10/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/Users/xxx/Work/projects/xiaomi/ibn-quality/ibn-quality-be/.venv/lib/python3.10/site-packages/django/apps/registry.py", line 116, in populate
    app_config.import_models()
  File "/Users/xxx/Work/projects/xiaomi/ibn-quality/ibn-quality-be/.venv/lib/python3.10/site-packages/django/apps/config.py", line 304, in import_models
    self.models_module = import_module(models_module_name)
  File "/usr/local/Cellar/python@3.10/3.10.5/Frameworks/Python.framework/Versions/3.10/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/Users/xxx/Work/projects/xiaomi/ibn-quality/ibn-quality-be/.venv/lib/python3.10/site-packages/django_celery_beat/models.py", line 8, in <module>
    import timezone_field
  File "/Users/xxx/Work/projects/xiaomi/ibn-quality/ibn-quality-be/.venv/lib/python3.10/site-packages/timezone_field/__init__.py", line 1, in <module>
    from timezone_field.fields import TimeZoneField
  File "/Users/xxx/Work/projects/xiaomi/ibn-quality/ibn-quality-be/.venv/lib/python3.10/site-packages/timezone_field/fields.py", line 11, in <module>
    class TimeZoneField(models.Field):
  File "/Users/xxx/Work/projects/xiaomi/ibn-quality/ibn-quality-be/.venv/lib/python3.10/site-packages/timezone_field/fields.py", line 41, in TimeZoneField
    default_zoneinfo_tzs = [ZoneInfo(tz) for tz in pytz.common_timezones]
  File "/Users/xxx/Work/projects/xiaomi/ibn-quality/ibn-quality-be/.venv/lib/python3.10/site-packages/timezone_field/fields.py", line 41, in <listcomp>
    default_zoneinfo_tzs = [ZoneInfo(tz) for tz in pytz.common_timezones]
  File "/usr/local/Cellar/python@3.10/3.10.5/Frameworks/Python.framework/Versions/3.10/lib/python3.10/zoneinfo/_common.py", line 24, in load_tzdata
    raise ZoneInfoNotFoundError(f"No time zone found with key {key}")
zoneinfo._common.ZoneInfoNotFoundError: 'No time zone found with key Asia/Hanoi'

关键信息:zoneinfo._common.ZoneInfoNotFoundError: 'No time zone found with key Asia/Hanoi'

报错原因

点击查看beat的一个bug
默认使用poetry add django_celery_beat安装时,pytz版本默认为2022.2,这个版本有bug,官方于2022年8月12日修复,建议安装pytz<2022.2版本

解决办法

  • 先检查已安装的pytz版本 - 已确认当前安装的是2022.2(中招)
  • 回退或更新pytz版本
    • pypi查看当前pytz的最新版本,发现最新版本为2022.2.1
    • 于是尝试更新pytz版本,发现同样能解决问题
  • python manage.py migrate django_celery_beat
  • python manage.py migrate django_celery_results
  • 检查数据库中是否有新增表成功
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值