[django] django background tasks 적용하기

su_y2on·2022년 1월 6일
0

Django

목록 보기
1/2
post-thumbnail

django crontab?

프로젝트 중 자정마다 예약상태를 변경시켜줘야했습니다
처음에 찾아본 것이 django crontab입니다
몇줄의 코드만으로 쉽게 주기적인 체크가 가능하게 해줍니다

하지만....
docker환경에서 제대로 돌아가지 않았던... 찾아보니 같은 문제를 겪는 사람들이 많았고 아마 crontab을 위한 container를 따로 만들어줘야하는 것 같습니다. 생각보다 간단하던 django-crontab이 너무 복잡해져서 찾아보다가 알게된 django background tasks



django background tasks

공식문서

공식문서에 사용법이 나와있으니 참고해보면 좋을 것 같습니다
저는 처음에 문서를 보고도 익숙하지 않은(?) 사용법이어서 적용하는데 꽤 걸린 것 같습니다.

그래서 제가 이해한대로 django background tasks적용을 정리해보려고합니다



1. 세팅

먼저 django-background-tasks를 설치해줍니다

pip install django-background-tasks


그리고 settings.py에 넣어줍니다

INSTALLED_APPS = (
    # ...
    'background_task',
    # ...
)

이제 migrate를 해주세요

python manage.py migrate


2. background task 정의

주기적으로 task를 적용할 app에 tasks.py를 만들어서 task를 정의합니다

이때 함수를 정의하고 @background(schedule= t)데코레이터를 붙여주면됩니다. t는 일을 실행시킨뒤에 t초후에 함수를 호출시키겠다는 것입니다.

from background_task import background


@background(schedule=30)
def reservation_state_change():

	# 주기적으로 예약 상태 변경을 위한 코드 
    
   


3. API에서 task사용하기

urls.py

urlpatterns = [
    .....
    path('states/', ReservationCheck.as_view()) # reservation 상태 체크
]

정의만 한 함수는 실행되지 않기 때문에 url을 만들고 view함수를 작성해줘야합니다. 이때 주기적으로 호출하고싶다면 task함수를 부를 때 repeat파라미터를 넘겨줍니다. (하루에 한번할거라면 Task.DAILY)

#tasks
from .tasks import reservation_state_change
from background_task.models import Task

# 예약 상태 확인 
class ReservationCheck(APIView):
    def get(self, request):
        reservation_state_change(repeat=Task.DAILY)
        return Response(status=status.HTTP_302_FOUND)


4. 서버에 적용시키기

서버실행 후 위에서 만든 api를 한번 요청합니다 이렇게 요청을 하면 주기적으로 할 task가 데이터베이스 테이블에 올라갑니다

이제 task를 실행시켜야합니다
만약 docker를 사용하고 있다면 web container에 접속한뒤 아래의 명령어를 처줍니다. &를 붙이는 이유는 background에서 돌리기 위해서입니다

python manage.py process_tasks &

runserver로 로컬테스트를 하시는 거라면 터미널 2개로 하나는 runserver 다른 하나는 명령어를 쳐주시면 됩니다

이 명령어는 task가 등록된 데이터베이스에서 등록된 task가 있다면 실행시키는 명령어입니다



5. task확인

admin페이지에 접속하면 아래와 같은 메뉴가 추가되어있고 completed tasks는 수행된 task 로그, tasks는 API호출로 데이터베이스에 올라간 task입니다

1개의 댓글

comment-user-thumbnail
2022년 10월 5일

django 버전이 몇인가요? 공식문서 보니까 2.2 버전까지만 지원한다고 되어 있어서요. 제 장고 버전이 4.0.6인데 오류가 뜹니다. ModuleNotFoundError: No module named 'django.conf.urls.defaults'

답글 달기