서비스를 만들다보면 자동으로 원하는 일을 서버에 시키고 싶은 경우가 생긴다. 나 같은 경우에는 하루가 지나면 데이터베이스에 저장되어 있는 데이터들 중 하루가 지나면 자동으로 비활성화 되게 하고 싶어서 Django Scheduler를 적용하려고 했다. django_apscheduler라는 간단한 모듈을 가지고 만들 수 있으니 정리해보려고 한다.
pip install django-apscheduler
settings.py
INSTALLED_APP = [
...
'django_apscheduler',
...
]
APSCHEDULER_DATETIME_FORMAT = "N j, Y, f:s a" # Default
SCHEDULER_DEFAULT = True
operator.py 파일에는 내가 실행하고 싶은 스케줄을 어떻게 실행할 것인지 설정하는 곳이다. 필자는 하루에 한번씩 실행하고 싶어서 다음과 같이 작성했다.
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import register_events, DjangoJobStore
from .views import expiry_check
def start():
scheduler=BackgroundScheduler()
scheduler.add_jobstore(DjangoJobStore(), 'djangojobstore')
register_events(scheduler)
@scheduler.scheduled_job('cron', hour=23, name = 'expiry_check')
def auto_check():
expiry_check()
scheduler.start()
관련된 옵션은 문서
위에서 확인 가능하다.
- DateTrigger: use when you want to run the task just once at a certain point of time
- IntervalTrigger: use when you want to run the task at fixed intervals of time
- CronTrigger: use when you want to run the task periodically at certain time(s) of day
- CalendarIntervalTrigger: use when you want to run the task on calendar-based intervals, at a specific time of day
이제 내가 원하는 작업을 작성해보자. 나는 스케줄러가 실행되면 특정 모델의 데이터들 중 날짜가 지난 데이터들을 자동으로 비활성화를 해주기 위해 다음과 같이 작성했다.
import datetime
from .models import Subscription
def expiry_check():
#날짜 셋팅
today = datetime.date.today()
subscriptions = Subscription.objects.filter(expiry=False)
if len(subscriptions) != 0:
for sub in subscriptions:
if sub.end_date < today:
sub.expiry = True
sub.save()
이제 서버가 실행되었을 때, DJango가 Scheduler를 포함해서 실행시키게 하기 위해 app.py를 수정해보자.
app.py
from django.apps import AppConfig
from django.conf import settings
class SubscriptionConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'subscription'
def ready(self):
if settings.SCHEDULER_DEFAULT:
from . import operator
operator.start()
참고로 필자는 subscription이라는 app의 app.py를 수정했다. operator와 view 파일 또한 해당 app에 포함되어 있다.
Django Scheduler를 사용하여 원하는 스케줄을 구현하는 방법에 대해서 알아봤다. django도 필요한 모듈을 다 갖추고 있어 매력적인 프레임워크라고 생각한다.