Django Working Process

이번에 서버 작업을 하면서 느끼게 된 점들을 정리해 보겠습니다. 향후 추가내용이 있으면 계속 추가 해 보겠습니다.

  1. 크롤링 작업 단위로 별도 함수를 적용한다
  2. 유효성 검사 작업도 별도 함수를 적용한다. (조건들이 추가되는 경우가 많아서…)


Django Datetime

FastAPI 에 대해서도 점차 정리해 보겠습니다

datetime 객체가 DB 에 저장하고 호출하는 경우, 강제로 UTC (그리니치 천문대 기준 시간대) 로 변환되는 경우를 마주치는데, 2줄 요약하면 다음과 같다

  1. settings.py 에서 USE_TZ = False 정의하기
  2. sqlite3 대신 mysql, psql 데이터베이스 사용하기


naive datetime objects

# settings.py
USE_TZ = True

TimeZone 정보가 분리된 datetime 객체를 DataBase 에서 사용 합니다. templates, forms 에서만 TIME_ZONE 이 적용되고, admin.py 등에서 변환된 시간대는 추가 설정 이 필요 합니다.

# admin.py
class Model(models.Model):
    datetime = models.DateTimeField()
    code = models.ForeignKey(Code, on_delete=models.CASCADE)
    
    def __str__(self) -> str:
        from django.utils import timezone
        time_date = timezone.make_naive(self.datetime)
        return str(self.datetime) + " | " + self.code.name

Rest Api 에서 활용하기 위해서도 추가 정의가 필요 합니다.

from pytz import timezone
from django.conf import settings
seoul = timezone(settings.TIME_ZONE) 
# <DstTzInfo 'Asia/Seoul' LMT+8:28:00 STD>

item = Model.objects.all()[0].datetime # tzinfo:utc
item.astimezone(seoul)  # DstTzInfo:'Asia/Seoul'

import datetime
from django.utils.timezone import now
now().astimezone(seoul) # DstTzInfo:'Asia/Seoul'
datetime.datetime.now().astimezone(seoul) # DstTzInfo 'Asia/Seoul'
now().astimezone(seoul).utcnow() # tzinfo:utc


Django 시간대 설정

# settings.py
USE_TZ = False

위 내용이 문제되는 이유는 sqlite3 에서 시간대를 정의할 수 없기 때문에 위 내용이 문제가 되었던 내용 입니다. 대신 위 설정을 정의하면 DataBase 에서 tz info 를 함께 저장해서 통일된 시간대를 활용할 수 있게 됩니다. 국내 서비스만을 위한 내용은 이 설정을 활용하면 됩니다.