카테고리 없음

Django apscheduler 사용해보기 (일정 시간마다 실행되는 로직 구현)

khw7876 2022. 9. 24. 22:16

apscheduler 란?

 
Django에서 지원하는 라이브러리로 일정 시간마다 실행되는 것을 job으로 구분하여 실행해주는 기능이다.
 
 
pip install django-apscheduler

우선 apscheduler를 설치해주자!!

 

Django에서 사용하는 라이브러리 이기에 역시 Settings.py에 등록을 해 주어야 한다!!

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

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

SCHEDULER_DEFAULT = True

INSTALLED_APP에 restframework처럼 추가를 해준다.

그리고 SCHEDULER_DEFAULT를 True를 주어서 사용할 수 있는 상태로 만들어준다.

 

자 그럼 이제 내가 일정 시간마다 실행시키고 싶은 함수를 작성을 해보자.

나는 Views.py에 작성을 해 보았다.

 

내가 일정 시간마다 작동시킬 함수!

(views.py)

def make_data():
    # 여기부터는 asset_group_info_set을 정제하는 데이터
    asset_group_data = pd.read_csv('investment_service/asset_group_info_set.csv')
    name_data = asset_group_data["종목명"]
    isin_data = asset_group_data["ISIN"]
    asset_group_name_data = asset_group_data["자산그룹"]
    
    for asset_group_name in asset_group_name_data:
        AssetGroupModel.objects.get_or_create(name = asset_group_name)
    
    for index, name in enumerate(name_data):
        current_price = InvestmentHistoryModel.objects.filter(isin = isin_data[index]).last()
        StockModel.objects.get_or_create(name = name, isin = isin_data[index], current_price = current_price)

    # 여기는 accoutn_accet_info_set.csv 파일을 정제하는 데이터
    account_asset_data = pd.read_csv('investment_service/account_asset_info_set.csv')

    username_data = account_asset_data["고객이름"]
    username_list = []
    for username in username_data:
        if not username in username_list:
            username_list.append(username)
    for username in username_list:
        UserModel.objects.get_or_create(username = username)

    bank_data = account_asset_data["증권사"]
    bank_list = []
    for bank_name in bank_data:
        if not bank_name in bank_list:
            bank_list.append(bank_name)
    for bankname in bank_list:
        BankModel.objects.get_or_create(name=bankname)

    account_name_data = account_asset_data["계좌명"]
    account_num_data = account_asset_data["계좌번호"]
    isin_data = account_asset_data["ISIN"]
    cur_price_data = account_asset_data["현재가"]
    order_data = account_asset_data["보유수량"]
    
    for index, account_num in enumerate(account_num_data):
        user = UserModel.objects.get(username=username_data[index])
        bank = BankModel.objects.get(name=bank_data[index])
        isin = StockModel.objects.get(isin=isin_data[index])
        InvestmentModel.objects.get_or_create(
            user = user,
            bank = bank,
            account_name = account_name_data[index],
            account_num = account_num
            )
        InvestmentHistoryModel.objects.get_or_create(
            user = user,
            bank = bank,
            account_name = account_name_data[index],
            account_num = account_num,
            isin = isin,
            cur_price = cur_price_data[index],
            order = order_data[index],
            )
        
    # 여기부터는 account_asset_basic을 정제하는 데이터 
    account_basic_data = pd.read_csv('investment_service/account_basic_info_set.csv')
    account_num_data = account_basic_data["계좌번호"]
    starting_fund_data = account_basic_data["투자원금"]

    for index, account_num in enumerate(account_num_data):
        investment_obj = InvestmentModel.objects.get(account_num = account_num_data[index])
        investment_obj.starting_fund = starting_fund_data[index]
        investment_obj.save()

위의 데이터는 csv파일을 pandas 라이브러리를 통하여 read_csv를 해주고 csv의 데이터를 ORM을 이용해 데이터를 저장하는 방식이다.

중복된 데이터를 생성하지 않기 위해 get_or_create()함수를 이용하였다.

또한 csv파일의 같은 열에서 데이터를 가져오기 위해서 enumerate를 사용하였고! 같은 인덱스에서 데이터를 가져오도록 하였다.

 

operator.py

from apscheduler.schedulers.background import BackgroundScheduler
from investment.views import make_data

def start():
    scheduler = BackgroundScheduler(timezone='Asia/Seoul')
    scheduler.add_job(make_data , 'cron', hour = '09')
    scheduler.start()

apscheduler를 사용하기 위해서 operator에 어떠한 기능을 사용 할 것인가, 언제 기능을 실행 할 것인가를 명시해주어야 한다.

그것을 operator가 담당하게 된다.

 

BackgroundScheduler를 상속받아서 실행을 하게 된다.

종류로는 BlockingScheduler도 있지만, 이부분은 다음에 추가적으로 정리를 해 보겠다.

 

스케쥴러에 add_job에 어떠한 작업을 추가 할 것인지를 명시하여준다.

이번에는 아까전에 views.py에 있는 make_data라는 함수를 실행시킬 것 이기에, make_data를 넣어준다.

방식은 cron을 사용하며 매일 9시마다 실행한다는 뜻이다.

 

이러한 방식으로는

 second = "*/50"

처럼 사용도 할 수 있는데, 앞에 */가 들어가면 ~~ 마다라는 뜻이다.

이것은 "50초마다 실행해!!" 라는 뜻이다.

 second = "50"

근데 만약 이렇게 사용을 한다면 "매 시각 second가 50이 될 때마다 실행해!!" 라는 뜻이 된다!

 

App.py

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

class InvestmentConfig(AppConfig):
    default_auto_field = "django.db.models.BigAutoField"
    name = "investment"

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

기본적으로 app.py에 아래 함수를 추가해준다!!

settings.py에서 SCHEDULER_DEFAULT = True로 설정이 되어있다면

설정한 operator.py를 실행시켜준다!

 

그리고 server를 실행시켜주면 스케쥴러가 작동을 하게 된다!!