55,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
헷갈려서 질문드립니다.
장고 채널스의 튜토리얼의 보고 도커 컴포즈로 레디스와 장고 서버를 연결 시켜주었습니다. 그런데 도커 환경에서도 redis 환경 변수 설정을 해주어야 하나요?
- 해결됨파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
@login_required 장식자를 적용한후에는 로그인을 성공하면 채팅방으로 어떻게 이동을 하는 건가요?
로그인을 하고 난후에 디폴트 주소가 /acconts/profile/ 인데@login_required 장식자를 적용한후에는 로그인을 성공하면 채팅방으로 어떻게 이동을 하는 건가요?채팅창에 있다가 로그아웃 한후 다시 로그인을 하면 profile 페이지로 이동하는데 강의에서는 채팅창으로 리다이렉션이 되는 이유가 궁금합니다.
- 미해결파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
docker run -d --restart always --name redis7 --publish 6379:6379 redis:7
docker --version Docker version 24.0.6, build ed223bc 으로 설치되어있는데 제목의 실행 명령어 수행시 docker run -d --restart always --name redis7 --publish 6379:6379 redis:7docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.See 'docker run --help'. 에러가 발생합니다
- 미해결파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
websocket 자바스크립트 클라이언트 구현?
안녕하세요! 선생님 강의를 보면 클라이언트 웹소켓 구현을 전부 자바스크립트만으로 구현을 하셨는데, 실제 제품을 만든다고 하면, 선생님 강의에서 구현하신것처럼 웹소켓 클라이언트 부분을 자바스크립트 만으로 충분할까요?아니면 웹소켓 관련 프레임워크가 있을까요?? 보통 웹 개발하면 순수 자바스크립트 만으로 개발을 잘 안하자나요?? 문뜩 든생각은 분명 원활한 개발을 위해 웹소켓도 뭔가 프레임워크 같은게 있을것 같은데, 회사가 파이썬으로 웹 개발하는 회사가 아니다 보니 잘 모르겠네요,.,,만약 있다면 어떤게 있고 참고할 만 자료가 있으면 알려주시면 감사합니다.혹시 제가 개념을 잘못 이해 하고 있으면 지적 부탁드립니다!!
- 해결됨파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
메세지 리액션 : 좋아요. 질문 드립니다.
좋아요 구현을 위해 append_message 함수에서 icon 생성 시 addEventListener를 등록하였습니다.append_message(message, pk , sender, time, img){ const like_icon = document.createElement('i'); like_icon.id = `like-icon-${pk}`; like_icon.className = 'fa-regular fa-heart'; like_icon.addEventListener('click', () => {this.like_msg(pk)}); ... }like_msg에서 removeEventLister를 통해 기존에 등록된 click를 해제하고 새로운 이벤트를 등록하였습니다.like_msg(pk){ const like_icon = document.querySelector(`#like-icon-${pk}`); like_icon.removeEventListener('click', () => {this.like_msg(pk)}); like_icon.addEventListener('click', () => {this.dislike_msg(pk)}); this.ws.send(JSON.stringify({ type : 'chat.message.like', pk : pk })) }사진과 같이 좋아요는 잘 작동합니다.다시 dislike를 하려면 계속 like_msg 이벤트가 동작합니다.like_icon을 통해서 하트를 변경하였습니다.case 'chat.message.like': this.like_icon(pk, cnt); break;event를 삭제하는 시점이 잘 못된것일까요? 제대로 삭제가 안 되더라구요. like_icon에서도 removeEventListener를 실행했었는데 동일한 결과가 나왔습니다. 어떤 시점에서 이벤트 리스너를 해제해야 할까요?
- 해결됨파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
{유저명}님이 메세지 입력 중입니다. 메세지 질문드립니다.
<form id="message_form"> <input type="text" name='message' class="form-control" autofocus autocomplete="off" id="msg-input"> </form>document.querySelector('#msg-input').addEventListener('keyup', this.on_typing.bind(this));on_typing(event){ if (event.target.value !== ''){ this.ws.send(JSON.stringify({ type : 'chat.message.typing' })) } },위에서 처럼 input에 keyup을 줘서 통신을 하도록 하였습니다. value를 기준으로 하니 input에 값을 입력할 때 마다 메시지가 만들어 지더라구요. keyup동안에 입력중이라는 신호를 줄 수 있는 방법이 있을까요?
- 해결됨파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
채팅 로비에서 유저수 노출을 위하여
LobbyMember 모델을 생성해서 index에 들어오면 해당 user를 추가하는 식으로 구성하였습니다.class LobbyMember(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)consumer에도 따로 LobbyConsumer를 생성하여 접속할 땐 생성하거나 조회하고 채팅방에 접속 시 삭제하도록 하였습니다.class LobbyConsumer(JsonWebsocketConsumer): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.group_name = "lobby" def connect(self): user = self.scope["user"] if not user.is_authenticated: self.close() else: lobby_user, _ = LobbyMember.objects.get_or_create(user=user) async_to_sync(self.channel_layer.group_add)( self.group_name, self.channel_name ) async_to_sync(self.channel_layer.group_send)( self.group_name, {"type": "lobby"}, ) self.accept() def disconnect(self, code): if self.group_name: async_to_sync(self.channel_layer.group_discard)( self.group_name, self.channel_name ) user = self.scope["user"] lobby_member, _ = LobbyMember.objects.get_or_create(user=user) lobby_member.delete() async_to_sync(self.channel_layer.group_send)( self.group_name, {"type": "lobby"}, ) def lobby(self, message_dict): count = LobbyMember.get_count() self.send_json({"type": "lobby", "count": count})정상적으로 작동하는가 싶더니 2개의 다른 브라우저에서 같은 이용자로 로그인 한 후한 곳에서 로그아웃하면 해당 유저가 삭제되어아직 로그인 되어 있는 쪽에서는 로그인 유저가 0명으로 표시되더라구요.지금처럼 LobbyMember를 생성하지 않고 기존 모델로 사용하는 방법이나 방향이 있을까요? 이렇게 하는건 아닌것 같아서 질문드립니다!
- 미해결파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
채팅방에서 마지막 유저가 나가면 채팅방 자동 삭제 질문드립니다.
채팅방에서 마지막 유저가 나가면 채팅방 자동 삭제를 구현하기 위해 , 그 뒤에 추가 과제들도 구현하기 위해 channel_name을 따로 model로 만들고 싶습니다.channel_name을 살펴보면 specific.19f083513f9244298b2f329aa6916165!fce7333e1805488dae51ab420eeaa6a4으로 구성되어 있습니다.test1, test2가 있다면 먼저 접속한 유저의 channel_name중 specific.19f083513f9244298b2f329aa6916165(!전까지)를 같이 공유해서 저장하는것 같더라구요.-> 맞을까요?그래서 specific.19f083513f9244298b2f329aa6916165까지는 동일하고 그 뒤에부터 다르게 저장되는것을 파악하였습니다.specific.19f083513f9244298b2f329aa6916165를 기준으로 model을 생성해서 관리하는 방법이 괜찮은 방법인지 질문드리고 싶습니다!서버가 강제 종료되면 이전에 channel_name이 그대로 남아있어서 최종적으로 마지막으로 나갔는지 파악하기 어려워 ChannelName를 생성해서 관리하면 괜찮지 않을까 생각했습니다.
- 미해결파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
동기방식의 consumer 클래스와 비동기방식의 consumer클래스의 차이가 뭔지 궁금합니다.
1. 동기방식의 consumer 클래스와 비동기방식의 consumer클래스의 차이가 뭔지 궁금합니다.jsonwebsocketconsumer에서 모델을 임포트하여 db를 수정해도 문제가 없을까요?? 웹소켓에 연결할때 마가 하나의 연결당 하나의 consumer가 생성되는건가요??
- 미해결파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
라이브러리 인식
프로젝트 생성 및 ASGI 개발서버 구동강의랑 똑같이 진행을 하였는데..PyCharm에서 django랑 channels 라이브러리를 인식 하지 못하는거 같습니다.라이브러리 목록에서는 보이는데 asgi.py 파일 에서는 라이브러리를 import해 오지 못하네요 이유를 알 수 있을가요?인식을 못하더라도 일단 코드 작성을 하면 서버 구동에는 문제가 없어요해당 부분 캡쳐 해서 같이 올리겠습니다.
- 미해결파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
AttributeError: 'NoneType' object has no attribute 'send'
import asyncio import os import django from channels.layers import get_channel_layer os.environ["DJANGO_SETTINGS_MODULE"] = "backend.settings" django.setup() async def main(): channel_layer = get_channel_layer() print(channel_layer) message_dict = {'content': 'world'} await channel_layer.send('hello', message_dict) response_dict = await channel_layer.receive('hello') is_equal = message_dict == response_dict print("송신/수신 데이터가 같습니까?", is_equal) asyncio.run(main())channel_layer가 자꾸 None으로 지정되서channel_layer.send이 부분도 실행이 안됩니다.구글링도 해보고 chatgpt에도 물어보고 redis 버전도 낮춰보고 다했는데 안됩니당..redis 4.3.6channels 4.0.0channels-redis 4.1.0입니다.
- 미해결파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
채팅서비스 배포시 구성
서비스 배포관련해서 질문이 있습니다. #1. redis서버 설치보통 서비스 배포시 redis서버는 어떻게 구성하나요? 구글링을 통해서 봤을때는 많은 경우, ec2내에 redis를 설치하는 모습이 보여서요. 보통 그렇게 진행하는지? #2. 가장 많이 사용하는 서버구성기본적으로 daphne가 받아서, http는 wsgi로, ws는 asgi로 보내는데. 어떤 곳에서는 Nginx로 daphne에게 ws만 넘기는게 좋다는 이야기도 있고 해서요. 보통 장고 channels로 개발시 서버는 어떤 구조가 많이 사용되나요? #3. daphne가 https도 wsgi로 잘 보내는지?application = ProtocolTypeRouter({ "http": django_asgi_app,현재 코드상에는 이렇게 해놓았는데, https처리하려면 추가적인 코드수정이 필요할까요?
- 미해결파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
로비 채팅 구현 섹션에서
안녕하세요 로비 채팅 구현 강의를 들으면서 구현 중인데 redis 서버도 정상적으로 잘 작동하고스크립트도 정확하게 썼는데 계속 채팅을 입력하고 엔터를 누르면 새로고침(초기화)이 되네요 ㅠㅠ 어떤게 문제일까요? 아무리 문제를 해결해봐도 이상한점은 찾아볼수가 없네요
- 해결됨파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
1대1 채팅방 만들때
1대1 채팅 기능을 만들고있습니다.소켓을 연결할때 방 ID를 이용하여 방에 들어 갈때마다 하나 하나 소켓에 연결해야할까요 아니면상대방 userID로 소켓에 연결하여 방 id와 함께 메세지를 전송해야할까요??
- 미해결파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
배포 문제
안녕하세요 강사님. 강의를 듣고 배포중에 에러가 났습니다.AWS의 Lightsail react 인스턴스와 django 인스턴스를 하나씩 만들어서 배포하는 중 서버와 API통신은 되지만 Socket통신이 되지않고 있습니다.WebSocket connection to 'ws://{path}/ws/chat/' failed 와 같은 에러가 나타는데 혹시 네트워크 설정이나 따로 해줘야할 설정같은게 있을까요??
- 해결됨파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
asgi 배포관련
안녕하세요 선생님강의를 다 듣고 본 강의를 기반으로 chat bot을 프로젝트로 배포하려고 하는 수강생입니다.aws를 통해서 배포하려고 자료를 찾아보는데 대부분 wsgi기반의 웹에 대해서 나와있더라고요.. 혹시 asgi를 기반으로 하는 웹은 어느경로를 통해서 배포하는게 나을지 물어볼 수 있을까요?
- 미해결파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
채팅할때 유저인증을 어떻게 처리해야 할까요??
다른 기능은 전부 스프링 서버에 구현 되어있고 장고는 채팅 서버만 구현되어있습니다. 이럴때 유저인증을 어떻게 해야할까요..
- 미해결파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
run_test_hello_channel.py 11002 Error
안녕하세요 강사님 run_test_hello_channel.py을 실행했더니 생기는 오류에 대해서 질문드립니다.실행을 했을시 True가 나올때도 있지만Traceback (most recent call last): File "D:\23_project\django_channels\venv\lib\site-packages\redis\asyncio\connection.py", line 709, in connect await self._connect() File "D:\23_project\django_channels\venv\lib\site-packages\redis\asyncio\connection.py", line 744, in _connect reader, writer = await asyncio.open_connection( File "C:\Users\honge\AppData\Local\Programs\Python\Python310\lib\asyncio\streams.py", line 47, in open_connection transport, _ = await loop.create_connection( File "C:\Users\honge\AppData\Local\Programs\Python\Python310\lib\asyncio\base_events.py", line 1016, in create_connection infos = await self._ensure_resolved( File "C:\Users\honge\AppData\Local\Programs\Python\Python310\lib\asyncio\base_events.py", line 1395, in _ensure_resolved return await loop.getaddrinfo(host, port, family=family, type=type, File "C:\Users\honge\AppData\Local\Programs\Python\Python310\lib\asyncio\base_events.py", line 855, in getaddrinfo return await self.run_in_executor( File "C:\Users\honge\AppData\Local\Programs\Python\Python310\lib\concurrent\futures\thread.py", line 58, in run result = self.fn(*self.args, **self.kwargs) File "C:\Users\honge\AppData\Local\Programs\Python\Python310\lib\socket.py", line 955, in getaddrinfo for res in _socket.getaddrinfo(host, port, family, type, proto, flags): socket.gaierror: [Errno 11002] getaddrinfo failed During handling of the above exception, another exception occurred: Traceback (most recent call last): File "D:\23_project\django_channels\run_test_hello_channel.py", line 23, in <module> asyncio.run(main()) File "C:\Users\honge\AppData\Local\Programs\Python\Python310\lib\asyncio\runners.py", line 44, in run return loop.run_until_complete(main) File "C:\Users\honge\AppData\Local\Programs\Python\Python310\lib\asyncio\base_events.py", line 641, in run_until_complete return future.result() File "D:\23_project\django_channels\run_test_hello_channel.py", line 16, in main await channel_layer.send('hello', message_dict) File "D:\23_project\django_channels\venv\lib\site-packages\channels_redis\core.py", line 218, in send await connection.zremrangebyscore( File "D:\23_project\django_channels\venv\lib\site-packages\redis\asyncio\client.py", line 484, in execute_command conn = self.connection or await pool.get_connection(command_name, **options) File "D:\23_project\django_channels\venv\lib\site-packages\redis\asyncio\connection.py", line 1525, in get_connection await connection.connect() File "D:\23_project\django_channels\venv\lib\site-packages\redis\asyncio\connection.py", line 715, in connect raise ConnectionError(self._error_message(e)) redis.exceptions.ConnectionError: Error 11002 connecting to redis-10519.c294.ap-northeast-1-2.ec2.cloud.redislabs.com:10519. 11002.위와 같은 에러가 발생할 때도 있습니다.혹시 지역이 일본으로 해놓아 거리때문에 생기는 이슈또는 너무 많은 요청에 의한 이슈일까요??
- 해결됨파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
채팅방 퇴장시 퇴장 메시지 출력 안됨
안녕하세요.채팅방에서 유저가 퇴장했을때 퇴장 했다는 메시지가 보여지질 않습니다. 그래서 disconnect, chat_user_leave method에 print를 추가해서 확인을 해보니 disconnect method에서 is_last_leave는 True가 찍혀 채널 레이어 그룹에 type=‘chat.user.leave’ 메시지를 보내는 것은 되는거 같은데, 그 후 chat_user_leave method가 실행이 안되는거 같습니다. (추가한 print가 실행이 안되서 터미널에 아무것도 찍히지 않습니다.) 이 부분이 원인거 같은데 무슨 문제인지 어떻게 해결해야될지 모르겠어서 질문드립니다.
- 해결됨파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
run_test_hello_channel.py 실행 no module named 'channel_redis' 오류 발생
m1 mac에서 강의를 듣고있습니다.env에서 channel_layer_redis 값을 파싱하는 것까지는 잘 따라왔는데run_test_hello_channel.py 에서 해당 오류가 발생하네요강사님 github에 있는 코드 그대로 복사해서 붙였는데도 오류가 나서 어디서부터 해결해야 할 지 모르겠습니다!도와주세요 ㅜㅜimport asyncioimport osimport djangofrom channels.layers import get_channel_layeros.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"django.setup()async def main(): channel_layer = get_channel_layer() message_dict = {'content': 'world'} await channel_layer.send('hello', message_dict) response_dict = await channel_layer.receive('hello') is_equal = message_dict == response_dict print("송신/수신 데이터가 같습니까?", is_equal)asyncio.run(main()) 터미널 결과는 다음과 같습니다. (webchat) tk_mac@itaegyeong-ui-MacBookAir webchat % python run_test_hello_channel.pyTraceback (most recent call last): File "/Users/tk_mac/opt/anaconda3/envs/webchat/lib/python3.10/site-packages/channels/layers.py", line 65, in makebackend backend_class = import_string(self.configs[name]["BACKEND"]) File "/Users/tk_mac/opt/anaconda3/envs/webchat/lib/python3.10/site-packages/django/utils/module_loading.py", line 30, in import_string return cached_import(module_path, class_name) File "/Users/tk_mac/opt/anaconda3/envs/webchat/lib/python3.10/site-packages/django/utils/module_loading.py", line 15, in cached_import module = import_module(module_path) File "/Users/tk_mac/opt/anaconda3/envs/webchat/lib/python3.10/importlib/__init__.py", line 126, in import_module return bootstrap.gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1050, in gcdimport File "<frozen importlib._bootstrap>", line 1027, in findand_load File "<frozen importlib._bootstrap>", line 992, in findand_load_unlocked File "<frozen importlib._bootstrap>", line 241, in callwith_frames_removed File "<frozen importlib._bootstrap>", line 1050, in gcdimport File "<frozen importlib._bootstrap>", line 1027, in findand_load File "<frozen importlib._bootstrap>", line 1004, in findand_load_unlockedModuleNotFoundError: No module named 'channel_redis' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/tk_mac/github/webchat/run_test_hello_channel.py", line 22, in <module> asyncio.run(main()) File "/Users/tk_mac/opt/anaconda3/envs/webchat/lib/python3.10/asyncio/runners.py", line 44, in run return loop.run_until_complete(main) File "/Users/tk_mac/opt/anaconda3/envs/webchat/lib/python3.10/asyncio/base_events.py", line 646, in run_until_complete return future.result() File "/Users/tk_mac/github/webchat/run_test_hello_channel.py", line 12, in main channel_layer = get_channel_layer() File "/Users/tk_mac/opt/anaconda3/envs/webchat/lib/python3.10/site-packages/channels/layers.py", line 357, in get_channel_layer return channel_layers[alias] File "/Users/tk_mac/opt/anaconda3/envs/webchat/lib/python3.10/site-packages/channels/layers.py", line 78, in getitem self.backends[key] = self.make_backend(key) File "/Users/tk_mac/opt/anaconda3/envs/webchat/lib/python3.10/site-packages/channels/layers.py", line 44, in make_backend return self._make_backend(name, config) File "/Users/tk_mac/opt/anaconda3/envs/webchat/lib/python3.10/site-packages/channels/layers.py", line 69, in makebackend raise InvalidChannelLayerError(channels.exceptions.InvalidChannelLayerError: Cannot import BACKEND 'channel_redis.core.RedisChannelLayer' specified for default