"장고 channels"의 두 판 사이의 차이
172.17.0.1 (토론) (→패키지 설치) |
|||
| (다른 사용자 한 명의 중간 판 5개는 보이지 않습니다) | |||
| 1번째 줄: | 1번째 줄: | ||
== 개요 == | == 개요 == | ||
| − | Channels. [https://channels.readthedocs.io/en/stable/ 공식링크]를 참고하였다. 사용하는 장고 버전에 따라 진행방식에 차이가 있을 수 있으니 유의하자. | + | Channels. 장고 프로젝트에 공식적으로 포함된, 웹소켓을 위한 라이브러리. |
| + | |||
| + | [https://channels.readthedocs.io/en/stable/ 공식링크]를 참고하였다. 사용하는 장고 버전에 따라 진행방식에 차이가 있을 수 있으니 유의하자. | ||
=== 버전별 호환 === | === 버전별 호환 === | ||
| 9번째 줄: | 11번째 줄: | ||
|- | |- | ||
|3 | |3 | ||
| − | |2.2 | + | |2.2~ |
| | | | ||
|- | |- | ||
| 20번째 줄: | 22번째 줄: | ||
ASGI는 비동기 요청인 웹 소켓을 처리하는 이벤트로 connect, send, receive, disconnect가 있다. | ASGI는 비동기 요청인 웹 소켓을 처리하는 이벤트로 connect, send, receive, disconnect가 있다. | ||
| − | |||
===패키지 설치=== | ===패키지 설치=== | ||
| + | 버전에 따라 방법이 달라질 수 있으니 공식 링크를 참고하자. | ||
{| class="wikitable" | {| class="wikitable" | ||
!과정 | !과정 | ||
| 30번째 줄: | 32번째 줄: | ||
|패키지 설치 | |패키지 설치 | ||
|Channels 패키지를 설치한다. | |Channels 패키지를 설치한다. | ||
| − | |pip install | + | stable 버전이 설치되며, 필요한 패키지들이 함께 설치된다. |
| + | |pip install channels | ||
|- | |- | ||
|앱 등록 | |앱 등록 | ||
| 48번째 줄: | 51번째 줄: | ||
|프로젝트의 asgi.py를 다음과 같이 편집한다. | |프로젝트의 asgi.py를 다음과 같이 편집한다. | ||
(장고 2.2라면 asgi.py가 없어 새로 작성해주어야 한다.) | (장고 2.2라면 asgi.py가 없어 새로 작성해주어야 한다.) | ||
| − | |장고 3.X대라면 아래처럼 덮어주고,<syntaxhighlight lang="python"> | + | |
| + | |||
| + | mysite.settings는 자신의 설정에 따라 다를테니, 여기에 맞게 해주면 된다. | ||
| + | | 장고 3.X대라면 아래처럼 덮어주고,<syntaxhighlight lang="python"> | ||
import os | import os | ||
| 63번째 줄: | 69번째 줄: | ||
# Just HTTP for now. (We can add other protocols later.) | # Just HTTP for now. (We can add other protocols later.) | ||
}) | }) | ||
| − | </syntaxhighlight>장고 2.2대라면 | + | </syntaxhighlight>장고 2.2대라면 settings.py와 같은 경로에 새로 작성해준다.<syntaxhighlight lang="python"> |
import os | import os | ||
| 77번째 줄: | 83번째 줄: | ||
# Just HTTP for now. (We can add other protocols later.) | # Just HTTP for now. (We can add other protocols later.) | ||
}) | }) | ||
| − | </syntaxhighlight>| | + | </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": 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 = | + | 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를 다시 켜거나 재부팅하면 해결되었다. | ||
| + | |||
| + | === 서비스가 https면 무조건 https로 === | ||
| + | 서비스가 https인데, ws로는 안되더라;; http를 https로 받아 다루기가 가능하지만, ws를 wss로 바꾸진 못하는 모양. 그래서, https로 들어와야 처리가 가능한 듯하더라. | ||
[[분류:장고 웹소켓]] | [[분류:장고 웹소켓]] | ||
2025년 10월 31일 (금) 15:31 기준 최신판
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가 없어 새로 작성해주어야 한다.)
|
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.)
})
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"
|
| 확인 | 서버를 실행해 확인해 보자. | 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를 다시 켜거나 재부팅하면 해결되었다.
3.2 서비스가 https면 무조건 https로편집
서비스가 https인데, ws로는 안되더라;; http를 https로 받아 다루기가 가능하지만, ws를 wss로 바꾸진 못하는 모양. 그래서, https로 들어와야 처리가 가능한 듯하더라.