일전에 만든 pandas 로직을 날마다 날마다 생성되는 log 데이터에 일정 시간마다 적용하고 싶었다.
이를 위해 django-apscheduler를 사용했다.
참고 문서 : django-apscheduler
pip install apscheduler
pip install django-apscheduler
일반 apscheduler와 django-apscheduler를 설치한다.
INSTALLED_APPS = [
...
'django_apscheduler',
...
]
APSCHEDULER_DATETIME_FORMAT = "N j, Y, f:s a"
installed_apps에 'django_apscheduler'를 추가한다.
그 후, DatetimeFormat을 설정해준다. (위의 값은 default)
해당 로직을 실행하고 싶은 app 안에 operator.py를 만들어준다(파일 이름은 마음대로)
from .models import *
from .serializers.date import *
import pandas as pd
from datetime import date, timedelta
from apscheduler.schedulers.background import BackgroundScheduler
# apscheduler를 사용하기 위해 import 해오기
import logging
ytd = date.today() - timedelta(days=1)
dates = ytd.strftime('%Y%m%d')
logger = logging.getLogger('trash_event')
def start():
scheduler = BackgroundScheduler()
# scheduler.add_job(daily_data, 'interval', seconds=5)
scheduler.add_job(daily_data, 'cron', hour=1)
scheduler.start()
def daily_data()
...
start 메서드를 정의한다
scheduler 변수를 BackgroundScheduler를 사용해 선언하고,
add_job 메서드를 추가한다.
add_job을 통해 스케쥴 시간을 관리할 수 있다.
(ex)
매 5초 마다 실행
scheduler.add_job(daily_data, 'interval', seconds=5)
매일 오전 1시 마다 실행
scheduler.add_job(daily_data, 'cron', hour=1)
해당 로직을 실행하고 싶은 app의 apps.py를 수정한다
from django.apps import AppConfig
from django.conf import settings
class StatsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'stats'
def ready(self):
if settings.SCHEDULER_DEFAULT:
from . import operator
operator.start()
settings를 import한다.
이 후, ready 메서드를 오버라이드 해준다.
이렇게 스케쥴러를 작성 후
매일 오전 1시에 하루 전날(ytd)의 로그 파일을 불러와 pandas 로직을 적용해 쓰레기통 사용량을 데이터베이스에 추가하는 작업이 실행됨을 확인하였다.