pre-print 프로젝트를 진행하면서 DJango 프로젝트에 일정 시간마다 이벤트를 줘야 하는 경우가 생겨
검색과 시도를 여러번 한 끝에 작업 스케줄러를 장고 프로젝트에 연결하는 데 성공하였는데
나 같이 장고에 주기적으로 이벤트를 실행시켜줘야하는 사람이 있을까 싶어
장고와 작업스케줄러의 자세한 설정 매커니즘을 작성한다.
1) 장고 프로젝트내 사용자 정의 명령 만들기
작업 스케줄러를 통해 일정 주기마다 실행시키고 싶은 파일을 만드는 단계이다.
=> 이와 같이 앱 폴더 내에 management 폴더를 만들고 그 하위 폴더로 commads폴더를 만들어 준다.
필자의 경우 preprint라는 앱 하위에 management/commads 디렉토리를 생성해 주었다.
이후 위 사진과 같이 management, commads 각 폴더에 __init__. py 파일을 추가해 준다.
2) 작업 스케줄러로 일정 주기마다 실행시키고 싶은 명령어를 작성할 파일 생성
이제 commands 디렉터리 하위에 작업 스케줄러로 주기마다 실행시키려는 파일을 생성하여 작성해 주면 된다.
필자의 경우는 reset_orders.py라는 파일을 만들었다.
-reset_orders.py-
=> 기본 형식은 위와 같다.
위의 코드를 그대로 복붙 후
"실행시키고 싶은 코드" 부분의 주기마다 진행되었으면 하는 코드를 작성해 주면 된다.
필자의 경우는 매일 8:40분에 Order와 OrderFile이라는 모델의 데이터를 삭제시켜줘야 하므로
아래와 같이 코드를 작성하였다.
3) 작업 스케줄러 생성 및 설정
1. 작업을 생성한다.
=> 윈도우 검색창에서 작업 스케줄러를 검색해 실행하면 위와 같은 창이 뜬다.
왼쪽 상단의 작업 스케줄러 라이브러리를 클릭하고 오른쪽 사이드 메뉴에서 작업 만들기를 클릭한다.
2. 일반 > 작업 이름 작성 & 권한 설정
=> 이제 위와 같이 이름란에 스케줄러의 이름을 정해주고
가장 높은 수준의 권한으로 실행을 체크해 준다.
(혹 본인의 프로젝트가 해당 사용자 로그인이 되어있지 않아도 주기적으로 실행되어야 한다면
사용자의 로그온 여부에 관계없이 실행으로 체크해 준다.)
3. 트리거 > 반복 실행될 주기를 설정
=> 트리거를 클릭 후 아래 새로 만들기 버튼을 클릭한다.
위 사진과 같은 팝업 창이 뜨게 되면 반복될 주기를 정할 수 있다.
필자의 경우 매일 8:43:26 시간에 이 스케줄러가 작동하도록 설정하였다.
완료되었으면 확인 클릭
(아래 고급설정란에 작업반복 간격을 클릭하고 시간을 설정해 주면
트리거 된 그 시점부터 반복 간격으로 설정한 시간마다 이 작업 스케줄러가 반복되니 참고하자.)
4. 동작 > 파이썬 경로, 인수 경로, 시작 위치 경로 설정
=> 가장 중요한 경로 설정이다. 작업 스케줄러가 우리의 장고 프로젝트의 경로를 찾아서 manage.py파일을 통해
우리가 작성한 commands 하위 파일을 실행시키기 위해 경로 설정이 필요하다.
프로그램/스크립트
위 프로그램/스크립트 입력창에는 python.exe의 경로를 입력해야 한다.
이 파이썬 경로는 컴퓨터에 설치된 python.exe의 경로가 아닌 우리의 DJango 프로젝트 내의 가상환경에
설치된 python.exe의 경로이다.
python.exe 경로 찾기
where python
=> 위 명령어를 장고 프로젝트에서 터미널을 열고 실행하면 파이썬 경로를 찾을 수 있다.
여러 경로가 출력되나 우리가 사용할 경로는 ~~\venv(가상환경 명)\Scripts\python.exe -> 이러한 형식의 경로이다.
필자의 경우 경로는 아래와 같다.
C:\Users\Owner\Documents\My-Project\pre-print-service\venv\Scripts\python.exe
=> 이 경로를 프로그램/스크립트 란에 작성해 준다.
인수 추가
인수 추가란에는 manage.py의 경로 & 명령어로 설정한(reset_orders) 파일을 실행시키기 위한 인수를 작성한다.
장고 프로젝트를 기준으로 manage.py가 있는 경로 + 실행하려는 파일 -> 이와 같이 작성하면 된다.
manage.py가 C:\Users\Owner\Documents\My-Project\pre-print-service\manage.py에 있다면
이 경로를 " " -> 따옴표로 감싸주고 (중요)
"C:\Users\Owner\Documents\My-Project\pre-print-service\manage.py" reset_orders
=> 이와 같이 뒤에 실행하려는 해당 파일을 붙여준다. (reset_orders에. py는 안 붙여도 됨)
이를 인수 추가란에 작성한다.
시작 위치
마지막으로 시작위치에는 장고 프로젝트의 manage.py 파일이 위치한 디렉터리 경로를 입력해 주면 된다.
-manage.py이 위치한 경로- => 장고프로젝트가 있는 폴더 경로
C:\Users\Owner\Documents\My-Project\pre-print-service
=> 이를 시작위치란에 작성해 주면 된다. (이 경로는 " "=> 따옴표로 감싸주면 안 됨)
5. 조건
=> 기본 디폴트 설정 값으로 전원란의 "컴퓨터의 AC 전원이 켜져 있는 경우에만 작업 시작" 부분이 체크되어 있다.
혹시 이대로 설정을 따라왔으나 작동되지 않는다면 위의 체크란을 해제해 주자.
6. 정상 작동되는지 확인해 보기
=> 모든 설정이 끝났다.
작업 스케줄러 라이브러리를 클릭하고 내리면 우리가 만든 작업 스케줄러 상태가 준비 상태로 있다.
=> 이와 같이 OrderFile 테이블에 채워져 있는 데이터들이
설정한 시간인 8시 43분이 지나자 명령프롬프트가 깜박이고
아래와 같이 스케줄러가 정상 작동하여 데이터가 지워진 것을 확인할 수 있다.
이와 같이 작업 스케줄러를 사용하여 DJango에서 여러 일들을 주기적으로 자동 실행할 수 있다.
장고 서버가 실행중이더라도 실행중이 아니더라도 윈도우 스케줄러는 정상 작동한다.
장고 내에도 Django Apscheduler라고 해서 스케줄러가 있다고 한다.
혹시 위 단계를 그대로 따라왔음에도 문제가 생겨 도저히 진행되지 않는다면
Django Apscheduler를 검색하여 진행해 보길....