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