我正在开发一个Django
项目。
我想自动同步类。
我的代码:
from datetime import timedelta
from celery.schedules import crontab
CELERYBEAT_SCHEDULE = {
'sync-classes': {
'task': 'scheduler.tasks.sync_classes',
'schedule': crontab(hour='0', minute=0),
}
CELERY_ENABLE_UTC = False
CELERY_TIMEZONE = 'Europe/London'
它适用于伦敦时区。
每个班级都有不同的时区。我希望计划根据类的相关时区自动运行。
在sync_classes()
方法中,我得到所有课程并在伦敦时区同步。
问题:如何根据时区同步每个班级?
这个代码在Django / Celery部分没有经过测试,但这里的想法是:
CELERYBEAT_SCHEDULE = {
'sync-classes': {
'task': 'scheduler.tasks.sync_classes',
'schedule': crontab(minute='*/15'),
}
CELERY_ENABLE_UTC = False
CELERY_TIMEZONE = 'Europe/London'
在这一点上,Celery的时区并不重要,因为我们将使用唯一合适的时区作为参考:UTC。import pytz
import datetime
utc_now = pytz.utc.localize(datetime.datetime.utcnow())
collected_tz_names = []
for tz in pytz.all_timezones_set:
test_dt = utc_now.astimezone(pytz.timezone(tz))
print("tz: %s, test_dt.time() %s" % (tz, test_dt.time()))
is_midnight = (
datetime.time(hour=0, minute=0, second=0) <=
test_dt.time() <=
datetime.time(hour=0, minute=10, second=0)
)
if is_midnight:
collected_tz_names.append(tz)
print("collected %s" % collected_tz_names)
如果要测试它,请将utc_now = pytz.utc.localize(datetime.datetime.utcnow())
“探测器”(或参考)更改为一些手动值,例如utc_now = pytz.utc.localize(datetime.datetime(year=2018, month=1, day=4, hour=4, minute=1, second=0)
)now
列表中收集了collected_tz_names
午夜的时区,就运行你的同步方法。假设您需要同步的对象是User
(s),对吧?而且你的User
模型有一个属性tz_name
,它指示每个用户的时区。在这种情况下,这应该做:
for user in User.objects.filter(tz_name__in=collected_tz_names):
user.synchronize()
请记住,在夏令时切换中,您可能最终会同步两次。