【发布时间】:2019-08-20 16:20:41
【问题描述】:
这是在为用户刷新访问令牌的上下文中。假设我们有函数refresh_user_token,它将CustomUser 对象作为user。
def refresh_user_token(user):
...
...
return result
我希望为特定的CustomUser 每次执行此函数以安排在 9 天内重复。
def refresh_user_token(user):
...
...
next_refresh = datetime.now() + timedelta(days=9)
schedule_refresh(user, scheduled_time=next_refresh)
return result
我看到的 Celery 的大多数用例都与执行批处理操作有关,但对于这种用途,我需要能够使用 Celery 似乎不可行的参数来执行函数。
确实有人建议设置一个 cron 作业来检查任何需要刷新 x 秒的令牌。
所以在CustomUser 对象上,我们有一个名为last_token_refresh 的DateTimeField。
@Celery.task
def refresh_auth_tokens():
users = CustomUser.objects.all()
for user in users:
last_refresh_delta = datetime.now(timezone.utc) - user.last_token_refresh
if last_refresh_delta.days >= 9:
refresh_user_token(user)
return True
else:
return False
这可以工作,但是当消息代理可以用于仅安排所需任务时,我觉得它非常费力。
【问题讨论】:
标签: python django celery django-celery django-cron