본문 바로가기

Python/Django

[Django Channels 2.4.0] Building simple Chat Server / 채팅 서버 구현 튜토리얼 part.1 Basic Setup

막연히 개인 채팅 서버를 구축해보고싶다! 해서 찾아본 django channels 라이브러리

이를 통해 HTTP 외의 일을 할 수 있다.

Django Channels란?

https://channels.readthedocs.io/en/latest/index.html#django-channels

 

Django Channels — Channels 2.4.0 documentation

Channels is a project that takes Django and extends its abilities beyond HTTP - to handle WebSockets, chat protocols, IoT protocols, and more. It’s built on a Python specification called ASGI. It does this by taking the core of Django and layering a fully

channels.readthedocs.io

Channels is a project that takes Django and extends its abilities beyond HTTP - to handle WebSockets, chat protocols, IoT protocols, and more. It’s built on a Python specification called ASGI(Asynchronous Server Gateway Interface).

 


채팅 서버 구현 튜토리얼

내 환경

Windows 10 HOME

Python 3.8.1

가상환경, Django, Project, App 구성

> mkdir chat_tutorial
> cd chat_tutorial
> python -m venv myvenv
> myvenv\Scripts\activate
> pip install django
> django-admin startproject mysite
> cd mysite
> python manage.py startapp chat

여기서는 우리는 chat/views.pychat/__init__.py 만 가지고 실습을 진행할거기에,

chat 디렉토리에서 위 두개의 파일을 제외한 파일들을 지워보자.

이렇게!

그리고 chat app이 있다는 것 project에게 알려주자.

# mysite\mysite\settings.py
INSTALLED_APPS = [
    'chat', # I'm here!
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

 

index view 추가하기

어떤 chatting room으로 들어갈지 물어보는 index view를 만들어보자.

 

우선, template을 만들어보자.

chat\templates\chat\index.html 을 만들고 다음 코드를 붙여넣자.

<!-- chat/templates/chat/index.html -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>Chat Rooms</title>
</head>
<body>
    What chat room would you like to enter?<br>
    <input id="room-name-input" type="text" size="100"><br>
    <input id="room-name-submit" type="button" value="Enter">

    <script>
        document.querySelector('#room-name-input').focus();
        document.querySelector('#room-name-input').onkeyup = function(e) {
            if (e.keyCode === 13) {  // enter, return
                document.querySelector('#room-name-submit').click();
            }
        };

        document.querySelector('#room-name-submit').onclick = function(e) {
            var roomName = document.querySelector('#room-name-input').value;
            window.location.pathname = '/chat/' + roomName + '/';
        };
    </script>
</body>
</html>

view를 만들자.

chat\views.py에 다음 코드를 붙여넣자.

# chat\views.py

from django.shortcuts import render

def index(request):
    return render(request, 'chat/index.html')

view를 불러오기위해, URL에 매핑해야한다. 이를 위해서 우린 URLconf가 필요하다.

chat\urls.py를 만들고 다음 코드를 넣자.

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

root URLconf가 chat.urls 모듈을 알 수 있게 하자.

mysite\urls.py의 코드를 다음과 같이 수정하자.

from django.contrib import admin
from django.urls import path
from django.conf.urls import include # include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('chat/', include('chat.urls')), # chat.urls
]

 

자, 이제 테스트를 해보자.

> python manage.py runserver

http://127.0.0.1:8000/chat/에 접속해서 다음과 같이 나오면 view는 잘 구축된 것이다.

동작 ok!


channels 라이브러리 통합하기

이전까지는 평범한 django app을 만드는 과정이었고, 아직 channel library는 쓰지 않았다.

이제 channel 라이브러리를 사용할 차례!

 

channels 패키지를 설치하자.

> python -m pip install -U channels

 

그리고 routing configuration을 만들자.

routing configurationURLconf와 비슷한 것으로,

channels server로 HTTP request가 왔을 떄,

어떤 코드를 channel이 run해야하는지 알려주는 역할을 한다.

 

mysite\routing.py 파일을 만들고 다음 코드를 넣자.

from channels.routing import ProtocolTypeRouter

application = ProtocolTypeRouter({
    # (http->django views is added by default)
})

 

그리고 channels library가 있다는 것을 installed_apps에 알려주자.

또한, root routing configuration에 있는 channel 또한 알려줘야 한다.

mysite\settings.py를 수정하자.

INSTALLED_APPS = [
    'channels', # it's good to write top here! To avoid conflict with other 3rd party apps
    'chat',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

# Channels
ASGI_APPLICATION = 'mysite.routing.application'

이 과정을 통해 runserver을 했을 때,

standard Django development server 을 Channels development server로 대체시킨다.

 

테스트해보자.

> python manage.py runserver

?????

에러났다......

비교적 쉽게 고쳤다!

[Python/Django] - [Django channels] NotImplemented error / 장고 채널 통합 후 runserver할 때 나는 에러

 

[Django channels] NotImplemented error / 장고 채널 통합 후 runserver할 때 나는 에러

Django channels 채팅 서버 구축 튜토리얼 도중에 난 에러 [Python/Django] - [Django Channels] Building simple Chat Server / 채팅 서버 구현 튜토리얼 part.1 에러 내용 Watching for file changes with StatR..

jisun-rea.tistory.com

고친 후 다시 해보면...

ASGI/Channels version 2.4.0 development server

성공!