바뀜

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>
 
|}
 
|}
 
==모델작성==
 
==모델작성==