[TIL_Carrotww] 68 - 22/12/08

유형석·2022년 12월 8일
0

TIL

목록 보기
80/138
post-thumbnail

📝Carrotww의 코딩 기록장

🧲 django created_at timezone

class RoomMessage(models.Model):
	created_at = models.DateTimeField(auto_now_add=True)

내 코드이다 위와같이 model을 생성하였고 settings.py의 timezone 에는 Asia/Seoul을 적어주었는데 실제 DB에 들어가는 created_at 은 UTC 시간이 들어가게 되었다. runserver 시에는 한국 시간이 나오기는 하지만 model에 저장이 다른 시간이 저장되면 무슨 소용이 있겠는가...

두가지 해결방법을 찾았다

  • 1번 해결 방법
class RoomMessage(models.Model):
	created_at = models.DateTimeField(auto_now_add=True)

    @property
    def created_at_korean_time(self):
        kr_time = timezone(settings.TIME_ZONE)
        return self.created_at.astimezone(kr_time)

이렇게 직접 코드를 짜줄 수 있다.
하지만 모든 models.py에서 해당 코드를 사용하면 귀찮다.

  • 2번 해결법
    난 이 방법을 사용하였다.
LANGUAGE_CODE = "ko-kr"

TIME_ZONE = "Asia/Seoul"

USE_I18N = True

USE_TZ = False
설정을 추가해주면 되는데 USE_TZ 가 True 상태일때는 forms, templates에서 settings의 timezone이 설정되고 models의 datetime에는 적용되지 않는다.
해서 default인 미국시간 'UTC' 값으로 들어가게 되는 것이다.
이를 False로 바꾸어 주면 model의 datetime 필드에도 내가 적용한 settings.py timezone이 적용된다.

🧲 Django Channels Authentication

1. Django 인증

Django 유저 모델을 상속받아 user 모델을 만들었다면 request.user 을 사용하여 user 객체를 손쉽게 가져올 수 있었을 것이다.
consumers.py websocket에서도 손쉽게 가능하다.

class ChatConsumer(WebsocketConsumer):

    def connect(self, event):
        user = self.scope["user"]

위와같이 하면 user 객체가 user에 담긴다.

2. 커스텀 인증

Django 인증을 사용하지 않는다면 아래와 같이 미들웨어를 직접 작성해줄 수 있다.

from channels.db import database_sync_to_async

@database_sync_to_async
def get_user(user_id):
    try:
        return User.objects.get(id=user_id)
    except User.DoesNotExist:
        return AnonymousUser()

class QueryAuthMiddleware:
    """
    Custom middleware (insecure) that takes user IDs from the query string.
    """

    def __init__(self, app):
        # Store the ASGI application we were passed
        self.app = app

    async def __call__(self, scope, receive, send):
        # Look up user from query string (you should also do things like
        # checking if it is a valid user ID, or if scope["user"] is already
        # populated).
        scope['user'] = await get_user(int(scope["query_string"]))

        return await self.app(scope, receive, send)

추가로 공식 문서에 사용자 로그인/ 로그아웃 방법이 있지만 굳이..? 라는 생각이 들기는 한다. 일단 나는 1번 방법으로 진행해 보고 추 후 커스텀 하는 방식으로 진행하려고 한다.
채팅에서 인증이 필요할거라고는 생각조차 하지 못했는데 찾아보다가 1번과 같은 쉬운 방법이 있어 만들었다.

profile
Carrot_hyeong

0개의 댓글