본문 바로가기
python

[python-django]스케쥴러(apschedular 사용)

by 하이바네 2022. 11. 15.
반응형

Django를 사용하면서 스케쥴러를 사용하기 위해서는 apschedular를 사용하면 간단하게 해결된다.

 

apschedular = Advanced Python Schedular를 뜻한다. 그리고 이것은 리눅스의 corn, 윈도우의 scheduler처럼 동작하지만 데몬이나 서비스는 아니고 어플리케이션 안에서 동작을 한다고 보면 된다.

 

자세한 내용은 다음 github에서 확인 가능하다.

 

 

GitHub - agronholm/apscheduler: Task scheduling library for Python

Task scheduling library for Python. Contribute to agronholm/apscheduler development by creating an account on GitHub.

github.com

 

 

GitHub - jcass77/django-apscheduler: APScheduler for Django

APScheduler for Django. Contribute to jcass77/django-apscheduler development by creating an account on GitHub.

github.com

 

 

* 선택

선택 가능한것은 두개가 있다.

1. apscheduler

2. django-apscheduler

 

스케쥴을 실행한다는 것에서 두개 다 같은 결과를 보여주지만,

간단한 특징으로 apscheduler는 python용으로 만들어진 것이고,

django-apscheduler는 django용으로 만들어진 것으로  db에 job을 저장하고 관리를 할 수 있게 해준다.

 

아래의 내용은 apscheduler를 사용한 예시이고, 삽질을 했기에 불필요한 내용이 포함되었을수도 있다.

 

* 모듈 설치

pip install apscheduler

 

* 예시

1. app의 폴더의 views.py에 스케쥴러 시 사용할 로직 작성 ex)주간 순위, 월간 순위 등
  

2. app의 폴더 내에 operator.py라는 파일을 생성하고 "1"번에서 만든 함수를 실행 시킬 준비(예시 코드는 다음과 같다)

from apscheduler.schedulers.background import BackgroundScheduler

from .views import create_week_rank

def start():

    scheduler=BackgroundScheduler()

    @scheduler.scheduled_job('cron', second='*/10', id='test')
    def auto_check():
        create_week_rank()
        
    scheduler.start()

create_week_rank라는 것을 만들었고 그것을 스케쥴러에 등록 시켰다. scheduled_job에 cron말고도 date, interval도 가능하다. 이에 대해서는 가이드를 보길 바란다.

 

 

User guide — APScheduler 3.9.1 documentation

Sometimes the scheduler may be unable to execute a scheduled job at the time it was scheduled to run. The most common case is when a job is scheduled in a persistent job store and the scheduler is shut down and restarted after the job was supposed to execu

apscheduler.readthedocs.io

 

3. app 폴더 내에 apps.py에 ready함수 생성 및 설정 추가

from django.apps import AppConfig
from django.conf import settings


class YoutuberConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'youtuber'

    def ready(self):
        if settings.SCHEDULER_DEFAULT:
            from . import operator
            operator.start()

위에서 def ready 부분만 보면된다. operator.py에 만들어놓은 start 함수를 실행 시키게 하는 것이다.

 

4. 마지막으로 config 폴더에 있는 settings.py에 설정 추가

#스케쥴러 관련
APSCHEDULER_DATETIME_FORMAT = "N j, Y, f:s a"  # Default
SCHEDULER_DEFAULT = True

이 부분은 지금 다른것도 사용하면서 테스트를 하다보니 정확하지 않다. 4번은 하지 말고 일단 테스트를 해보자.

-> 확인 결과 SCHEDULER_DEFAULT = True는 적어야 스케쥴러가 동작을한다. 사용하지 않는다면 False로 해놓자.

APSHEDULER_DATETIME_FORMAT 부분은 아직 확인중이다

 

위와 같이 한다면 잘 동작할 것이다.

 

필자는 다음과 같이 create_week_rank 함수 시작과 끝에 print를 넣어서 확인하고 있다.

 

다들 한번에 잘 해결되길 바란다! 굿럭!

728x90

댓글