Django apscheduler 사용해보기 (일정 시간마다 실행되는 로직 구현)
apscheduler 란?
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를 실행시켜주면 스케쥴러가 작동을 하게 된다!!