191번째 줄: |
191번째 줄: |
| </syntaxhighlight> | | </syntaxhighlight> |
| |} | | |} |
− | === 참가자 구현 === | + | === 참가자(컨슈머) 구현 === |
| {| class="wikitable" | | {| class="wikitable" |
| !과정 | | !과정 |
278번째 줄: |
278번째 줄: |
| | | |
| 네이티브로 설치하는 게 아니라 도커를 사용할 거라면 아래로 넘어가자. | | 네이티브로 설치하는 게 아니라 도커를 사용할 거라면 아래로 넘어가자. |
| + | |
| + | 단순 apt-get install redis로 설치해 5 이상의 버전이 되어도 작동한다. |
| |[http://id8436.iptime.org:8080/mediawiki/index.php/Radis Redis] 문서 참조. | | |[http://id8436.iptime.org:8080/mediawiki/index.php/Radis Redis] 문서 참조. |
| |- | | |- |
343번째 줄: |
345번째 줄: |
| await self.send(text_data=json.dumps({"message": message})) | | await self.send(text_data=json.dumps({"message": message})) |
| </syntaxhighlight> | | </syntaxhighlight> |
| + | |
| + | = 서버에 반영 = |
| + | 튜토리얼엔 나오지 않지만(공식문서 한참 뒤에 나온다..), 서버에 반영하게 되면 ws/ 경로에 대하여 새로운 설정을 해주어야 한다.(필자는 이걸 몰라서 이것저것 건드리다가 sql 날려먹었다.. 젠장) |
| + | |
| + | 일반적으로 WSGI 통신을 gunicorn으로 처리한다면, ASGI통신은 daphne으로 처리한다.(daphne에서도 wsgi통신이 가능하지만, 보안상 권장되진 않는다.) |
| + | {| class="wikitable" |
| + | !과정 |
| + | !설명 |
| + | !방법 |
| + | |- |
| + | | 설치 |
| + | |daphne은 channels를 설치하면 자동으로 설치가 된다. |
| + | | |
| + | |- |
| + | |확인 |
| + | |실행 명령은 우측과 같다.(asgi의 경로를 지정해주면 된다.) |
| + | |
| + | 포트번호는 필요에 따라 지정하면 된다. |
| + | |
| + | 해당 포트로 접속해보면 사이트와 채팅이 잘 작동한다. |
| + | |<code>daphne -b 0.0.0.0 -p 8001 config.asgi:application</code> |
| + | |- |
| + | |서버에서 실행 |
| + | |서비스를 위해선 백그라운드로 진행해주어야 한다. |
| + | 실행 여부는 <code>ps -ef | grep daphne</code>로 확인해보자. 실행이 안되면 nohup 떼서 에러메시지 확인. |
| + | |<code>nohup daphne -b 0.0.0.0 -p 8001 config.asgi:application &</code> |
| + | |- |
| + | |웹서버에 반영 |
| + | |/static을 반영하듯, /ws로 시작되는 주소는 다핀으로 넘겨준다. |
| + | 이후 관련 서비스들을 재시작하면 설정들이 반영된다. |
| + | |
| + | 채팅도 물론 성공적...! |
| + | |<syntaxhighlight lang="bash"> |
| + | location /ws { |
| + | proxy_pass http://localhost:8001; |
| + | proxy_http_version 1.1; |
| + | proxy_set_header Upgrade $http_upgrade; |
| + | proxy_set_header Connection "upgrade"; |
| + | } |
| + | </syntaxhighlight> |
| + | |} |
| + | 웹소켓에서도 https 인증을 적용할 수 있다.([https://victorydntmd.tistory.com/265 추후에 반영해보자.]) |
| + | |
| + | == 관련에러 == |
| + | |
| + | === The app module <module '앱이름' (<_frozen_importlib_external._NamespaceLoader object at 0x7f2faed9a8f0>)> has multiple filesystem locations (['/./앱경로', '/앱경로']); you must configure this app with an AppConfig subclass with a 'path' class attribute. === |
| + | 생각지도 못한 문제점이었다... 앱은 하나의 모듈처리가 되어 디렉토리 안에 __init__.py가 담기는데, 이게 없는 경우 경로를 제대로 찾지 못해 발생하는 에러이다. 앱 디렉토리 안에 __init__.py를 제대로 넣어주면 해결됨. |
| | | |
| = 마무리. 각 요소들이 어떤 역할을 하는지. = | | = 마무리. 각 요소들이 어떤 역할을 하는지. = |
| 순서대로 어떤 경로를 거쳐 작동하는지 살펴보자. | | 순서대로 어떤 경로를 거쳐 작동하는지 살펴보자. |
| | | |
− | === asgi === | + | === asgi.py === |
| {| class="wikitable" | | {| class="wikitable" |
| !항목 | | !항목 |
353번째 줄: |
402번째 줄: |
| |- | | |- |
| | ProtocolTypeRouter | | | ProtocolTypeRouter |
− | |연결의 종류를 파악하여 처리 | + | |연결의 종류를 파악하여 처리. http로 넘길지, 웹소켓 처리로 넘길지. |
| + | |
| + | * http 연결일 경우 보통 django_asgi_app<code>(get_asgi_application())</code> 가 실행된다. |
| + | * websocket 연결(ws:// 혹은 wss://)일 경우 <code>AuthMiddlewareStack</code>으로 앱별로 <code>routing.py</code>에 적어놓은 코드로 라우팅 한다. |
| + | |- |
| + | | |
| + | | |
| + | * |
| |} | | |} |
| + | |
| + | === routing.py === |
| + | 들어온 경로와 컨슈머를 연결해준다. urls.py와 view.py의 관계. |
| + | |
| + | 다음과 같은 형태로 컨슈머를 연결한다.<syntaxhighlight lang="python"> |
| + | websocket_urlpatterns = [ |
| + | re_path(r'ws/notification/(?P<center_name>\w+)/$', consumers.NotificationConsumer.as_asgi()), |
| + | ] |
| + | </syntaxhighlight> |
| + | |
| + | === [컨슈머는 컨슈머 문서로 옮김] === |
| [[분류:장고 웹소켓]] | | [[분류:장고 웹소켓]] |