第5部分-使用芹菜自动执行维护工作

情景

在……里面 Part 1 你创造了你自己的 Authorization Server 而且进展得很顺利。然而,数据库中充斥着过期的令牌。您可以定期运行 cleartokens management command ,但为什么不通过以下方式实现自动化 Celery

设置RabbitMQ

芹菜组件通过消息队列进行通信。我们将使用 RabbitMQ

在MacOS上安装RabbitMQ

如果您使用的是MacOS,很可能您已经在使用 Homebrew 。如果没有,那么现在就是安装这个非常棒的包管理器的时候了。

brew install rabbitmq
brew service start rabbitmq

使用Docker安装RabbitMQ

这将启动一个只工作的停靠站图像:

docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.9-management

在Windows上安装RabbitMQ

请参阅 RabbitMQ Installing on Windows 指示。

加芹菜

确保您的Virtualenv处于活动状态并安装 celerydjango-celery-beat

pip install celery django-celery-beat

更新您的已安装应用程序列表以包括您的 Authorization Server App--我们将其命名为 tutorial ,以及 django_celery_beat 它扩展了Django项目以将定期任务计划存储在数据库中,并添加了一个用于配置它们的Django Admin界面。

INSTALLED_APPS = {
    # ...
    "tutorial",
    "django_celery_beat",
}

现在,在你的应用程序中添加一个新文件来添加芹菜: tutorial/celery.py

import os

from celery import Celery

# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tutorial.settings')
app = Celery('tutorial', broker="pyamqp://guest@localhost//")
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django apps.
app.autodiscover_tasks()

这将自动发现任何 tasks.py 已安装应用程序列表中的文件。我们现在将添加我们的 tutorial/tasks.py

from celery import shared_task

@shared_task
def clear_tokens():
    from oauth2_provider.models import clear_expired

    clear_expired()

最后,更新 tutorial/__init__.py 要确保在应用程序启动时加载芹菜:

from .celery import app as celery_app

__all__ = ('celery_app',)

跑芹菜打和工人

RabbitMQ应该已经在运行了;它是BEAT和Worker之间的“粘合剂”。

最好在它们各自的终端窗口中运行它们,这样您就可以看到日志消息。

开始打芹菜

celery -A tutorial beat -l INFO  --scheduler django_celery_beat.schedulers:DatabaseScheduler

开始做芹菜工人

celery -A tutorial worker -l INFO

配置 clear_tokens 任务

走进 Django Admin 您将看到一个有关定期任务的新部分:

Django管理界面屏幕截图

现在,让我们定义一个相当短(10秒)的时间间隔。转到:http://127.0.0.1:8000/admin/django_celery_beat/intervalschedule/并选择添加间隔,将间隔数设置为10,将间隔时间设置为秒,然后保存。

然后转到http://127.0.0.1:8000/admin/django_celery_beat/periodictask/以添加新的定期任务,方法是选择 Add Periodic Task 并选择 tutorial.tasks.clear_tokens ,请选择 every 10 seconds Interval Schedule(时间间隔计划)和“保存”。

Django管理界面屏幕截图

现在,您的芹菜节拍和芹菜工人应该开始每10秒运行一次任务。

节拍控制台将如下所示:

[2022-03-19 22:06:35,605: INFO/MainProcess] Scheduler: Sending due task clear stale tokens (tutorial.tasks.clear_tokens)

工人控制台是这样的:

[2022-03-19 22:06:35,614: INFO/MainProcess] Task tutorial.tasks.clear_tokens[5ec25fb8-5ce3-4d15-b9ad-750b80fc07e0] received
[2022-03-19 22:06:35,616: INFO/ForkPoolWorker-8] refresh_expire_at is None. No refresh tokens deleted.
[2022-03-19 22:06:35,629: INFO/ForkPoolWorker-8] 0 Expired access tokens deleted
[2022-03-19 22:06:35,631: INFO/ForkPoolWorker-8] 0 Expired grant tokens deleted
[2022-03-19 22:06:35,632: INFO/ForkPoolWorker-8] Task tutorial.tasks.clear_tokens[5ec25fb8-5ce3-4d15-b9ad-750b80fc07e0] succeeded in 0.016124433999999965s: None

参考文献

以上内容基于以下参考文献: