바뀜

3,312 바이트 추가됨 ,  2023년 12월 8일 (금) 08:52
잔글
편집 요약 없음
1번째 줄: 1번째 줄:  
== 개요 ==
 
== 개요 ==
Channels. [https://channels.readthedocs.io/en/stable/ 공식링크]를 참고하였다. 사용하는 장고 버전에 따라 진행방식에 차이가 있을 수 있으니 유의하자.
+
Channels. 장고 프로젝트에 공식적으로 포함된, 웹소켓을 위한 라이브러리.
   −
장고는 기본적으로 동기식으로, WebSockets, chat protocols, IoT protocols 등을 위해선 비동기식 처리가 필요하다. 이를 위해 Django Channels가 마련되어 있다.
+
[https://channels.readthedocs.io/en/stable/ 공식링크]를 참고하였다. 사용하는 장고 버전에 따라 진행방식에 차이가 있을 수 있으니 유의하자.
 +
 
 +
=== 버전별 호환 ===
 +
{| class="wikitable"
 +
!channel 버전
 +
!django 버전
 +
!비고
 +
|-
 +
|3
 +
|2.2~
 +
|
 +
|-
 +
|4
 +
|
 +
|
 +
|}장고는 기본적으로 동기식으로, WebSockets, chat protocols, IoT protocols 등을 위해선 비동기식 처리가 필요하다. 이를 위해 Django Channels가 마련되어 있다.
    
ASGI(Async Server Gateway Interface)프로토콜을 토대로 작동하는데, WSGI를 계승하여 이와 잘 호환되도록 설계되어 있다.
 
ASGI(Async Server Gateway Interface)프로토콜을 토대로 작동하는데, WSGI를 계승하여 이와 잘 호환되도록 설계되어 있다.
    
ASGI는 비동기 요청인 웹 소켓을 처리하는 이벤트로 connect, send, receive, disconnect가 있다.
 
ASGI는 비동기 요청인 웹 소켓을 처리하는 이벤트로 connect, send, receive, disconnect가 있다.
      
===패키지 설치===
 
===패키지 설치===
 +
버전에 따라 방법이 달라질 수 있으니 공식 링크를 참고하자.
 
{| class="wikitable"
 
{| class="wikitable"
 
!과정
 
!과정
17번째 줄: 32번째 줄:  
|패키지 설치
 
|패키지 설치
 
|Channels 패키지를 설치한다.
 
|Channels 패키지를 설치한다.
|pip install -U channels
+
stable 버전이 설치되며, 필요한 패키지들이 함께 설치된다.
 +
|pip install channels
 
|-
 
|-
 
|앱 등록
 
|앱 등록
 
|settings.py에 추가.
 
|settings.py에 추가.
channels는 runserver 명령을 제어하여 기존 서버를 대체한다.
+
channels는 runserver명령을 제어하여 기존 서버를 대체한다.
 +
 
 +
runserver에 관여하는 다른 앱이 없다면 문제 없이 작동한다.
 
|INSTALLED_APPS 하위, 가장 처음에 <code>'channels'</code>넣는다.<syntaxhighlight lang="python">
 
|INSTALLED_APPS 하위, 가장 처음에 <code>'channels'</code>넣는다.<syntaxhighlight lang="python">
 
INSTALLED_APPS = [
 
INSTALLED_APPS = [
30번째 줄: 48번째 줄:  
</syntaxhighlight>
 
</syntaxhighlight>
 
|-
 
|-
|라우팅 설정 작성
+
|asgi.py 설정
|가장 상위의 디렉터리에 routing.py를 다음과 같이 작성한다.
+
|프로젝트의 asgi.py를 다음과 같이 편집한다.
(취향에 따라 달리 작성해도 된다.)
+
(장고 2.2라면 asgi.py가 없어 새로 작성해주어야 한다.)
|<syntaxhighlight lang="python">
+
 
 +
 
 +
mysite.settings는 자신의 설정에 따라 다를테니, 여기에 맞게 해주면 된다.
 +
| 장고 3.X대라면 아래처럼 덮어주고,<syntaxhighlight lang="python">
 +
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.)
 +
})
 +
</syntaxhighlight>장고 2.2대라면 settings.py와 같은 경로에 새로 작성해준다.<syntaxhighlight lang="python">
 +
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.)
 +
})
 +
</syntaxhighlight> |<syntaxhighlight lang="python">
 +
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.)
 +
})
 +
</syntaxhighlight>asgi.py가 없는 낮은버전의 경우 아래와 같이 만들어주자.<syntaxhighlight lang="python">
 +
import os
 +
 
 +
import django
 +
from channels.http import AsgiHandler
 
from channels.routing import ProtocolTypeRouter
 
from channels.routing import ProtocolTypeRouter
 +
 +
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
 +
django.setup()
    
application = ProtocolTypeRouter({
 
application = ProtocolTypeRouter({
    # (http->django views is added by default)
+
  "http": AsgiHandler(),
 +
  # Just HTTP for now. (We can add other protocols later.)
 
})
 
})
 
</syntaxhighlight>
 
</syntaxhighlight>
 
|-
 
|-
 
|설정 추가
 
|설정 추가
|settings.py 안에 우측의 내용을 추가한다.
+
|settings.py 안에 우측의 내용을 추가한다. # 프로젝트의 세팅에 맞춰 변형.
 
라우팅파일의 위치만 잘 잡아주면 된다.
 
라우팅파일의 위치만 잘 잡아주면 된다.
 
|<syntaxhighlight lang="python">
 
|<syntaxhighlight lang="python">
ASGI_APPLICATION = 'routing.application'  # routing.py 파일의 application을 불러온다.
+
ASGI_APPLICATION = "myproject.asgi.application"
 
</syntaxhighlight>(라우팅 파일 안의 application을 가져온다.)
 
</syntaxhighlight>(라우팅 파일 안의 application을 가져온다.)
 +
|-
 +
|확인
 +
|서버를 실행해 확인해 보자.
 +
|python manage.py runserver
 
|}
 
|}
 +
 +
= 팁 =
 +
asgi를 사용하게 된 후 runserver를 실행하면 로딩이 끝난 후에도 서버가 제대로 응답하지 않는다. 개발하는 입장에선 생각보다 느리게 반응해서 굉장히 답답하다; 때문에 일시적으로 asgi를 사용하지 않게끔 아래 옵션을 주어 실행하면 이전과 같이 빠른 속도로 개발 서버를 켤 수 있다.
 +
 +
(참고로, 기본 runserver로 실행해서 static을 잡아준 후에 --noasgi를 사용해야 제대로 static을 잡아 보여준다.)
 +
 +
python manage.py runserver --noasgi
 +
 +
= 관련 에러 =
 +
 +
=== ModuleNotFoundError: No module named 'channels' ===
 +
채널을 찾지 못해 생기는 에러인데, 구글링해보면 설치하라는 이야기가 대다수이다.. 문제는 설치를 하고 위 과정을 진행했는데도 나오는 경우..
 +
 +
어이없게도 IDE를 다시 켜거나 재부팅하면 해결되었다.
 
[[분류:장고 웹소켓]]
 
[[분류:장고 웹소켓]]