260번째 줄:
260번째 줄:
같은 브라우저를 띄워두고 한쪽에서 채팅을 치면 다른 쪽에서 안뜨는데, 다른 브라우저에선 안뜬다. 접속한 모두에게 반영될 수 있도록 채널레이어를 구현한다.
같은 브라우저를 띄워두고 한쪽에서 채팅을 치면 다른 쪽에서 안뜨는데, 다른 브라우저에선 안뜬다. 접속한 모두에게 반영될 수 있도록 채널레이어를 구현한다.
+
= 채널 레이어 구현 =
=== 체널레이어 구현 ===
=== 체널레이어 구현 ===
+
consumer 인스턴스는 자동으로 유일한 channel name을 구성하기 때문에 서로 소통하려면 layer가 필요하다.
{| class="wikitable"
{| class="wikitable"
!과정
!과정
288번째 줄:
290번째 줄:
== 개요 ==
== 개요 ==
−
레디스 서버를 이용한 실시간 채팅 구현
+
레디스 서버를 이용한 실시간 채팅 구현.
+
+
꽤 오래된 버전인 5를 사용하는데, 아마도 이는.. 5에서 처음으로 consumer groups이 구현된 버전인데, 이걸로 구현했기 때문이 아닐까 싶다.
===사전설정===
===사전설정===
{| class="wikitable"
{| class="wikitable"
296번째 줄:
300번째 줄:
|-
|-
| 서버 설치
| 서버 설치
−
|
+
|설치 후 딱히 옵션을 변경할 내용은 없다.
−
|apt-get install redis-server
+
+
어차피 로컬에서 모든 작동이 수행되기 때문에.
+
|[http://id8436.iptime.org:8080/mediawiki/index.php/Radis Redis] 문서 참조.
|-
|-
|서버 테스트
|서버 테스트
303번째 줄:
309번째 줄:
서버 구동에 대한 메시지가 뜬다.
서버 구동에 대한 메시지가 뜬다.
|redis-server
|redis-server
−
|-
−
|채널 라이브러리 설치
−
|장고에서 사용할 채널 라이브러리를 설치한다.
−
|pip install -U channels
|-
|-
|연동 라이브러리 설치
|연동 라이브러리 설치
|서버와 채널을 연동할 라이브러리를 설치한다.
|서버와 채널을 연동할 라이브러리를 설치한다.
|pip install channels_redis
|pip install channels_redis
−
|-
−
|앱을 만든다.
−
|
−
|django-admin startapp chat
−
|-
−
|앱 등록
−
|settings.py에 추가.
−
|INSTALLED_APPS 가장 위에 'channels', 'chat'을 맨 위에 추가해준다.
−
다른 서드파티 앱과 충돌할 수 있어 가장 처음에 둔다.
|-
|-
|세팅
|세팅
|settings.py 안에 추가.
|settings.py 안에 추가.
|<syntaxhighlight lang="python">
|<syntaxhighlight lang="python">
−
ASGI_APPLICATION = 'config.routhing.application'
+
ASGI_APPLICATION = "mysite.asgi.application" # 이부분은 채널을 설치할 때 작성한 부분.
−
CHANNEL_LAYERS = {
CHANNEL_LAYERS = {
−
'default':{
+
"default": {
−
'BACKEND': 'channels_redis.core.RedisChannelLayer',
+
"BACKEND": "channels_redis.core.RedisChannelLayer",
−
'CONFIG': {
+
"CONFIG": {
−
"hosts": [('127.0.0.1', 6379)],
+
"hosts": [("127.0.0.1", 6379)],
−
}
+
},
−
}
+
},
}
}
−
+
</syntaxhighlight>을 추가해준다.
−
os.environ["DJANGO_ALLOW_ASYNC_UNDAFE"] = "true"
+
|-
−
</syntaxhighlight>을 추가해준다.(대강 스테틱 설정 아래면 적당)
+
|기능 확인
+
|리눅스 기반의 OS에서 개발과 서비스를 하고 있다면 기능의 확인이 수월하겠지만... 윈도우 기반의 OS에서 개발이 진행된다면 쉽지 않다.
+
우측과 같이 파이썬 쉘을 통해 서버의 실행을 점검해보자.
+
|<syntaxhighlight lang="bash">
+
python3 manage.py shell
+
>>> import channels.layers
+
>>> channel_layer = channels.layers.get_channel_layer()
+
>>> from asgiref.sync import async_to_sync
+
>>> async_to_sync(channel_layer.send)('test_channel', {'type': 'hello'})
+
>>> async_to_sync(channel_layer.receive)('test_channel')
+
{'type': 'hello'}
+
</syntaxhighlight>
|}
|}
==모델작성==
==모델작성==