막연히 개인 채팅 서버를 구축해보고싶다! 해서 찾아본 django channels 라이브러리
이를 통해 HTTP 외의 일을 할 수 있다.
Django Channels란?
https://channels.readthedocs.io/en/latest/index.html#django-channels
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.py 와 chat/__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는 잘 구축된 것이다.
channels 라이브러리 통합하기
이전까지는 평범한 django app을 만드는 과정이었고, 아직 channel library는 쓰지 않았다.
이제 channel 라이브러리를 사용할 차례!
channels 패키지를 설치하자.
> python -m pip install -U channels
그리고 routing configuration을 만들자.
routing configuration은 URLconf와 비슷한 것으로,
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할 때 나는 에러
고친 후 다시 해보면...
성공!