진행하고 있는 장고 프로젝트에 cron 작업을 추가하는 경험을 정리해본다.
환경 및 선수조건
- Django
- crontab의 개념
- (선택) pyenv와 virtualenv를 이용한 가상환경(가상환경에서도 잘 돌아가고 경로 설정을 자동으로 해줍니다.)
crontab 사용 이유
문제
- 기존 API를 호출하면 페이지를 크롤링을 하고 그에 대한 결과를 응답하는데 시간이 3초 이상걸린다.
해결
- 크롤링하고자하는 페이지를 주기적으로 크롤링해서 결과를 DB에 저장해두고 API는 DB에 저장된 값들만 가져온다.
설정
pip를 통한 설치
pip install django-crontab
settings.py에 django_crontab를 추가
settings.py
...
INSTALLED_APPS = (
'django_crontab',
...
)
...
app/cron.py의 파일을 생성 및 함수 만들기
- 해당 장고프로젝트의
app
(본인의 경우에는 main이라는 앱명을 지었습니다.)폴더 안에cron.py
파일을 생성하고 함수를 만듭니다. - 사실 함수를 불러올 수 있는 경로이면 상관 없습니다. 즉, 따로 cron.py를 만들지 않고 경로만 잘 잡아주면 됩니다.
app/cron.py
def my_cron_job():
pass
settings.py에 있는 CRONJOBS에 작업 추가하기
- 기본 Linux crontab과 형식이 같습니다.(참고)
- 기본 구조:
* * * * * 수행할 명령어
- 순서대로 분(0 - 59) 시(0 - 23) 일(1 - 31) 월(1 - 12) 요일(0 - 6) (0:일요일, 1:월요일, 2:화요일, …, 6:토요일)
- 예제:
('*/5 * * * *', 'app.cron.my_cron_job')
-> 매 5분마다app/cron.py
에 있는my_cron_job()
을 실행합니다.
settings.py
...
CRONJOBS = [
('*/5 * * * *', 'app.cron.my_cron_job')
]
...
적용
등록된 job들을 모두 실행
python manage.py crontab add
등록된 job들을 모두 제거
python manage.py crontab remove
등록된 job들을 모두 보기
- django-crontab을 통해서 등록한 job들이 보여집니다.
python manage.py crontab show
확인
- 위에 나와있는 명령어로 확인이 가능하지만
django-crontab
의 경우에는 등록을 하면 Linux crontab에 등록이 된다. crontab -e
의 명령어를 통해서 확인이 가능하다.
실수
django-crontab
을 이용하는 경우에 실제 리눅스에 등록된crontab
이 작동하는거기 때문에 파일의 경로에 신경을 써줘야합니다.- 예를 들어서, 위에
cron.py
에서 파일을 새로 생성했다면 프로젝트의 앱 폴더(app/
)가 아닌! 리눅스 유저 기본 디렉토리(~
)에 위치합니다!