Django Apscheduler을 사용해보자

DARTZ·2022년 6월 15일
0

Django, Wagtail

목록 보기
3/5

공식 문서

들어가기 전에..

서비스를 만들다보면 자동으로 원하는 일을 서버에 시키고 싶은 경우가 생긴다. 나 같은 경우에는 하루가 지나면 데이터베이스에 저장되어 있는 데이터들 중 하루가 지나면 자동으로 비활성화 되게 하고 싶어서 Django Scheduler를 적용하려고 했다. django_apscheduler라는 간단한 모듈을 가지고 만들 수 있으니 정리해보려고 한다.

본문

1. apscheduler 설치

pip install django-apscheduler

settings.py

INSTALLED_APP = [
	...
    'django_apscheduler',
    ...
]

APSCHEDULER_DATETIME_FORMAT = "N j, Y, f:s a"  # Default

SCHEDULER_DEFAULT = True

2. operator.py 파일 작성

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

3. view.py 파일 작성

이제 내가 원하는 작업을 작성해보자. 나는 스케줄러가 실행되면 특정 모델의 데이터들 중 날짜가 지난 데이터들을 자동으로 비활성화를 해주기 위해 다음과 같이 작성했다.

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()

4. app.py 파일 작성

이제 서버가 실행되었을 때, 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도 필요한 모듈을 다 갖추고 있어 매력적인 프레임워크라고 생각한다.

profile
사람들이 비용을 지불하고 사용할 만큼 가치를 주는 서비스를 만들고 싶습니다.

0개의 댓글