Django 시작 시 코드 한 번만 실행
AppConfig 사용
AppConfig
클래스를 사용하면 Django가 시작될 때 코드를 한 번 실행할 수 있습니다.
다음은 AppConfig
클래스를 사용하는 방법의 예입니다.
from django.apps import AppConfig
class MyAppConfig(AppConfig):
name = 'myapp'
def ready(self):
# 여기서 실행할 코드를 작성합니다.
print("MyApp이 시작되었습니다!")
이 코드는 myapp
앱이 Django에 등록될 때 ready()
메서드를 한 번 실행합니다.
management 커맨드 사용
manage.py
커맨드를 사용하여 Django가 시작될 때 실행할 코드를 작성할 수도 있습니다.
다음은 management
커맨드를 사용하는 방법의 예입니다.
# myapp/management/commands/startapp.py
from django.core.management.base import BaseCommand
class Command(BaseCommand):
help = 'Django 시작 시 코드를 한 번 실행합니다.'
def handle(self, *args, **options):
# 여기서 실행할 코드를 작성합니다.
print("Django가 시작되었습니다!")
이 코드는 manage.py startapp myapp
커맨드를 실행하면 myapp
앱에 management/commands/startapp.py
스크립트를 만듭니다. 이 스크립트는 Django가 시작될 때 실행됩니다.
signals 사용
signals
을 사용하여 Django가 시작될 때 코드를 실행할 수도 있습니다.
다음은 signals
을 사용하는 방법의 예입니다.
from django.dispatch import receiver
from django.db import models
@receiver(models.signals.post_save, sender=User)
def user_created(sender, instance, created, **kwargs):
if created:
# 신규 사용자 생성 시 실행할 코드를 작성합니다.
print("새로운 사용자가 생성되었습니다!")
이 코드는 사용자가 생성될 때마다 user_created
함수를 실행합니다.
주의 사항
- 위의 방법 중 하나를 사용할 때 Django가 코드를 한 번만 실행하는지 확인해야 합니다.
AppConfig
클래스를 사용하는 경우 Django가 개발 모드에서 실행될 때 코드를 여러 번 실행할 수 있습니다. 이를 방지하려면--noreload
옵션을 사용하여 Django 서버를 실행하십시오.management
커맨드를 사용하는 경우 스크립트 이름이 충돌하지 않도록 주의해야 합니다.
예제 코드
from django.apps import AppConfig
class MyAppConfig(AppConfig):
name = 'myapp'
def ready(self):
# 이미 실행되었는지 확인합니다.
if not hasattr(self, '_has_run'):
# 코드를 실행합니다.
print("MyApp이 시작되었습니다!")
# 실행되었음을 표시합니다.
self._has_run = True
이 코드는 _has_run
속성을 사용하여 코드가 이미 실행되었는지 확인합니다. 속성이 설정되지 않은 경우 코드를 실행하고 속성을 설정합니다.
# myapp/management/commands/startapp.py
from django.core.management.base import BaseCommand
class Command(BaseCommand):
help = 'Django 시작 시 코드를 한 번 실행합니다.'
def handle(self, *args, **options):
# 이미 실행되었는지 확인합니다.
if not os.path.exists('myapp/started.txt'):
# 코드를 실행합니다.
print("Django가 시작되었습니다!")
# 실행되었음을 표시합니다.
with open('myapp/started.txt', 'w') as f:
f.write('started')
이 코드는 myapp/started.txt
파일의 존재 여부를 확인하여 코드가 이미 실행되었는지 확인합니다. 파일이 없으면 코드를 실행하고 파일을 만듭니다.
from django.dispatch import receiver
from django.db import models
@receiver(models.signals.post_save, sender=User)
def user_created(sender, instance, created, **kwargs):
# 이미 실행되었는지 확인합니다.
if not hasattr(instance, '_has_run'):
# 코드를 실행합니다.
print("새로운 사용자가 생성되었습니다!")
# 실행되었음을 표시합니다.
instance._has_run = True
대체 방법
템플릿 태그 사용
Django 템플릿 태그를 사용하여 코드를 한 번만 실행할 수 있습니다.
{% if not request.user.is_authenticated %}
<script>
// 코드를 작성합니다.
console.log("사용자가 로그인되지 않았습니다.");
</script>
{% endif %}
이 코드는 사용자가 로그인되지 않은 경우에만 스크립트를 실행합니다.
캐시 사용
Django 캐시를 사용하여 코드가 이미 실행되었는지 확인할 수 있습니다.
from django.core.cache import cache
def my_code():
# 코드를 작성합니다.
print("코드가 실행되었습니다!")
if not cache.get('my_code_run'):
my_code()
cache.set('my_code_run', True)
이 코드는 my_code
함수가 이미 실행되었는지 확인하기 위해 캐시를 사용합니다. 함수가 실행되지 않은 경우 함수를 실행하고 캐시 값을 설정합니다.
데코레이터 사용
from django.utils.decorators import decorator
def only_once(function):
@decorator
def decorated(*args, **kwargs):
if not decorated.has_run:
decorated.has_run = True
function(*args, **kwargs)
return decorated
@only_once
def my_code():
# 코드를 작성합니다.
print("코드가 실행되었습니다!")
python django