개인프로젝트) Django로 채팅 기능을 만들어보자 ! (1)

2024. 9. 13. 15:24프로젝트

 


항상 채팅 기능을 만들고 싶다는 생각을 했었다 ! 

바쁘단 핑계로 미뤄두다가 이제서야 해본다! 겸사겸사 기록도 하면 좋지 뭐얌 ?

사실, 채팅을 구현한다 ! 보다는 코드 다 뜯어보고 소켓프로그래밍을 공부한다에 더 초점이 맞춰져있기 때문에.. 

본분을 잊지 않으면서,, 한 번 시작해보자! 
채팅 만드는 과정은 밑에 사이트를 참고 했다! 

https://career.proxify.io/article/real-time-chat-with-Django#building-a-real-time-chat-system-with-django


완전 처음부터 시작해보자 ! 

1. 가상환경 만들기

2. 장고 깔기

3. 프로젝트 시작하기

4. 앱 만들기

이정도는 뭐 ~ 

 

여기까지 하고 깃헙이랑 연결을 해보자!

 

난 배포한 프로젝트 위에 할 거기 때문에 .... 

매우매우 간단하게 프로젝트 하나 만들고 

배포 먼저 때린 플젝,,, 

궁금하다면 ~ 

여기를 확인해주시고! 

 

아직 다 못 씀요 .. ㅎ 수정 중~

 

나 이제 뭐해야하지?

일단 챗 관련된 앱 만들고 ... 그냥 순서대로 따라하면 되지 뭐! 

 

 

 

1. 일단 channels 설치! 

channels 는 무엇일까 ?
궁금하면 공식문서로 가보자 ! 
https://channels.readthedocs.io/en/latest/index.html
"채널은 Django의 기본 비동기 뷰 지원을 래핑하여 Django 프로젝트에서 HTTP뿐만 아니라 장기 연결이 필요한 프로토콜(예: WebSockets, MQTT, 챗봇, 아마추어 무선 등)도 처리할 수 있도록 합니다."
(무슨 말인지 모르겠죠 ? 저도요 ... )

 

python -m pip install -U channels

 

-m 옵션 (아무리 찾아도 안 나오길래 gpt 사용했읍니다..)

`python -m pip install` 명령어에서 `-m` 옵션은 
Python 인터프리터에 특정 모듈을 스크립트처럼 실행하라고 지시하는 옵션입니다. 

의미:
- `-m`은 "module"의 약자로, Python 표준 라이브러리나 설치된 패키지 중에서 지정한 모듈을 찾아 실행합니다.
- `python -m pip`는 Python 인터프리터가 `pip` 모듈을 직접 실행하도록 합니다.

왜 사용하는가?
- `pip install`만 사용할 때는 운영 체제에 `pip` 명령어가 제대로 설정되어 있어야 하지만, `python -m pip`를 사용하면 Python 환경에서 직접 `pip`를 실행하기 때문에 버전 문제나 경로 문제를 피할 수 있습니다.
- 여러 Python 버전을 사용하는 환경에서 특정 Python 버전의 `pip`를 실행할 때 유용합니다. 예를 들어, `python3.9 -m pip install`은 Python 3.9의 `pip`를 사용해 설치합니다.

예시:
python -m pip install requests
-> 위 명령어는 현재 Python 환경의 `pip` 모듈을 사용해 `requests` 패키지를 설치합니다.

 

 

-U 옵션

이미 설치된 패키지를 최신 버전으로 업그레이드 할 수 있음. 패키지를 최신 버전으로 유지가능.

 

 

2. Daphne 설치!

Daphne :  channels를 개발 모드에서 작동하도록 하는 것

python -m pip install -U daphne

 

3. settings.py에 추가

 INSTALLED_APPS = [
  <br></br>
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    # Daphne must be listed before django.contrib.staticfiles
    'daphne',
    'django.contrib.staticfiles',
    # Adding the newly installed dependencies
    'channels'
]

 

 

다른 앱을 방해하지 않도록 목록 끝에 채널을 추가하는 것이 중요합니다 INSTALLED_APPS. 또한 ASGI 애플리케이션을 프로젝트의 기본 ASGI 파일로 설정해야 합니다. ASGI(Asynchronous Server Gateway Interface)는 비동기 Python 웹 서버와 애플리케이션 간의 브리지 역할을 합니다. WSGI의 모든 기능을 제공하지만 비동기 작업에 맞게 조정되었습니다.

?? ASGI 가 뭔데요...? Interface 라니까 뭔가를 이어주는 거 같긴 한데 ...

궁금하면 ? 공식문서 ㄱ https://channels.readthedocs.io/en/latest/asgi.html

공식문서 한글 번역 제대로 안 되어있길래 gpt 돌려봄.. 물론 어려운 건 매한가지,, 필요한 사람들은 읽어보도록 하자! ⬇️⬇️⬇️

더보기

ASGI(비동기 서버 게이트웨이 인터페이스)는 Channels와 Daphne가 기반으로 하고 있는 사양으로, Channels 애플리케이션을 특정 애플리케이션 서버와 분리하고 애플리케이션과 미들웨어 코드를 작성하는 공통적인 방법을 제공합니다.

ASGI는 WSGI의 후속작으로, asyncio를 통한 비동기 방식뿐만 아니라 여러 프로토콜을 지원하도록 설계되었습니다.

ASGI의 전체 사양은 여기에서 확인할 수 있습니다.

요약

ASGI는 단일 비동기 호출 가능한 구조로 되어 있으며, 이는 scope 딕셔너리와 두 개의 호출 가능한 receive와 send를 인수로 받습니다:

python
코드 복사
async def application(scope, receive, send): event = await receive() ... await send({"type": "websocket.send", ...})

scope 딕셔너리는 연결의 속성을 정의하며, 예를 들어 HTTP의 경우 원격 IP나 채팅 프로토콜의 사용자 이름 등을 포함하고, 연결의 수명 주기 동안 유지됩니다. 애플리케이션은 scope마다 한 번씩 인스턴스화되며, 예를 들어 HTTP 요청당 한 번 또는 열린 WebSocket 연결당 한 번 인스턴스화됩니다.

scope는 항상 type 키를 가지며, 이는 어떤 종류의 연결인지, 어떤 다른 키들이 있는지, 그리고 어떤 종류의 메시지를 예상할 수 있는지를 알려줍니다.

receive는 이벤트가 발생할 때마다 딕셔너리로 제공하는 대기 가능한 객체이고, send는 비슷한 딕셔너리 형식으로 클라이언트에 이벤트를 보내는 대기 가능한 객체입니다.

프로토콜 서버는 클라이언트와 애플리케이션 코드 사이에 위치하여, 원시 프로토콜을 scope와 이벤트 딕셔너리로 디코딩하고, 애플리케이션에서 보낸 이벤트를 프로토콜에 맞게 인코딩합니다.

조합성

ASGI 애플리케이션은 WSGI와 마찬가지로 조합 가능하게 설계되었으며, 여기에는 Channels의 라우팅 및 미들웨어 구성 요소인 ProtocolTypeRouter와 SessionMiddleware도 포함됩니다. 이들은 다른 ASGI 애플리케이션을 인수로 받는 ASGI 애플리케이션일 뿐이며, 전체 Django 프로젝트에서 최상위 애플리케이션 하나만 전달하여 처리하는 연결 종류에 따라 적절한 소비자에게 연결을 분배할 수 있습니다.

프로토콜 사양

기본 ASGI 사양은 ASGI 앱의 인터페이스만 정의하며, 네트워크 프로토콜이 scope와 이벤트 딕셔너리로 인코딩 및 디코딩되는 방법을 지정하지 않습니다. 이는 프로토콜 사양의 역할입니다.

N 번 정도 읽고 위에 설명 읽으니 어느정도 이해되긴 했는데 ... 이건 공부 더 하게되면 자연스럽게 알아질 거 같다! 

일단 지금은 패스!

 

 

3-1. settings.py아래 줄을 파일 끝에 추가

ASGI_APPLICATION = 'DjangoChat.asgi.application'

주의! DjangoChat 은 앱 이름임! 다른 이름으로 했다면 그걸로 설정해줘야합니다~

 

이거 왜 하나요 ?

ASGI_APPLICATION값이 'DjangoChat'이라는 현재 Django 애플리케이션의 ASGI 애플리케이션을 가리키도록 설정합니다.

 

라는데.. 뭐 그냥 ASGI 를 써야하니까 그런 거 아닐까 ? 

 

4. ASGI 잘 되나 테스트 해보기! 

python manage.py runserver

 

서버 실행 해서 여태까지 한 게 잘 돌아가나를 보는 것인데 ! 음

왜 ASGI 서버가 먼저이지?! 뭔가 내가 놓친 부분이 있는 거 같다...!

ASGI 에 대해선 밑에 글에 정리했으니 확인해보자~ 

https://hsjoo126.tistory.com/67

 

ASGI가 뭐에요? 에서 시작된... WSGI, CGI, WAS

장고에서 채팅을 구현하다가, ASGI 라는 말이 나오길래 엥? 저게 뭐지..? 에서 시작된 글이다 ! 그냥 공식 문서 보고 이해가 되었다면 좋았을텐데... 안타깝게도 그렇지 않았음.ASGI 정리글 이라고

hsjoo126.tistory.com