第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处于活动状态并安装 celery 和 django-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 您将看到一个有关定期任务的新部分:
现在,让我们定义一个相当短(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(时间间隔计划)和“保存”。
现在,您的芹菜节拍和芹菜工人应该开始每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
参考文献
以上内容基于以下参考文献: