장고 channels

1 개요편집

Channels. 장고 프로젝트에 공식적으로 포함된, 웹소켓을 위한 라이브러리.

공식링크를 참고하였다. 사용하는 장고 버전에 따라 진행방식에 차이가 있을 수 있으니 유의하자.

1.1 버전별 호환편집

channel 버전 django 버전 비고
3 2.2~
4

장고는 기본적으로 동기식으로, WebSockets, chat protocols, IoT protocols 등을 위해선 비동기식 처리가 필요하다. 이를 위해 Django Channels가 마련되어 있다.

ASGI(Async Server Gateway Interface)프로토콜을 토대로 작동하는데, WSGI를 계승하여 이와 잘 호환되도록 설계되어 있다.

ASGI는 비동기 요청인 웹 소켓을 처리하는 이벤트로 connect, send, receive, disconnect가 있다.

1.2 패키지 설치편집

버전에 따라 방법이 달라질 수 있으니 공식 링크를 참고하자.

과정 설명 방법
패키지 설치 Channels 패키지를 설치한다.

stable 버전이 설치되며, 필요한 패키지들이 함께 설치된다.

pip install channels
앱 등록 settings.py에 추가.

channels는 runserver명령을 제어하여 기존 서버를 대체한다.

runserver에 관여하는 다른 앱이 없다면 문제 없이 작동한다.

INSTALLED_APPS 하위, 가장 처음에 'channels'넣는다.
INSTALLED_APPS = [
    'channels',  # 다른 서드파티 앱과 충돌할 수 있어 가장 처음에 둔다.
    ...  # 공식 튜토리얼에선 'chat'을 상위로 올리지만, 아래에 있어도 상관 없다.
    ...
    'chat',
asgi.py 설정 프로젝트의 asgi.py를 다음과 같이 편집한다.

(장고 2.2라면 asgi.py가 없어 새로 작성해주어야 한다.)


mysite.settings는 자신의 설정에 따라 다를테니, 여기에 맞게 해주면 된다.

import os

from channels.routing import ProtocolTypeRouter
from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
# Initialize Django ASGI application early to ensure the AppRegistry
# is populated before importing code that may import ORM models.
django_asgi_app = get_asgi_application()

application = ProtocolTypeRouter({
    "http": django_asgi_app,
    # Just HTTP for now. (We can add other protocols later.)
})
asgi.py가 없는 낮은버전의 경우 아래와 같이 만들어주자.
import os

import django
from channels.http import AsgiHandler
from channels.routing import ProtocolTypeRouter

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
django.setup()

application = ProtocolTypeRouter({
  "http": AsgiHandler(),
  # Just HTTP for now. (We can add other protocols later.)
})
설정 추가 settings.py 안에 우측의 내용을 추가한다. # 프로젝트의 세팅에 맞춰 변형.

라우팅파일의 위치만 잘 잡아주면 된다.

ASGI_APPLICATION = "myproject.asgi.application"
(라우팅 파일 안의 application을 가져온다.)
확인 서버를 실행해 확인해 보자. python manage.py runserver

2편집

asgi를 사용하게 된 후 runserver를 실행하면 로딩이 끝난 후에도 서버가 제대로 응답하지 않는다. 개발하는 입장에선 생각보다 느리게 반응해서 굉장히 답답하다; 때문에 일시적으로 asgi를 사용하지 않게끔 아래 옵션을 주어 실행하면 이전과 같이 빠른 속도로 개발 서버를 켤 수 있다.

(참고로, 기본 runserver로 실행해서 static을 잡아준 후에 --noasgi를 사용해야 제대로 static을 잡아 보여준다.)

python manage.py runserver --noasgi

3 관련 에러편집

3.1 ModuleNotFoundError: No module named 'channels'편집

채널을 찾지 못해 생기는 에러인데, 구글링해보면 설치하라는 이야기가 대다수이다.. 문제는 설치를 하고 위 과정을 진행했는데도 나오는 경우..

어이없게도 IDE를 다시 켜거나 재부팅하면 해결되었다.