gpt4 book ai didi

python - Django WebSocket 断开/ws/聊天/大厅/[127.0.0.1 :3022]

转载 作者:太空宇宙 更新时间:2023-11-03 19:44:55 27 4
gpt4 key购买 nike

我想创建聊天应用程序,我遵循 https://channels.readthedocs.io/en/latest/tutorial/part_2.html在这里,

chat/
__init__.py
routing.py
urls.py
settings.py
wsgi.py

我将此代码添加到我的routing.py

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import chat.routing

application = ProtocolTypeRouter({
# (http->django views is added by default)
'websocket': AuthMiddlewareStack(
URLRouter(
chat.routing.websocket_urlpatterns
)
),
})

在我的settings.py中

ASGI_APPLICATION = 'Accounting.routing.application'
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
"hosts": [('127.0.0.1', 6379)],
},
},
}

在我的 urls.py 中

urlpatterns = [
path('chat/', include('chat.urls')),
path('admin/', admin.site.urls),
]

在我的聊天应用程序中

chat/
__init__.py
consumers.py
routing.py
templates/
chat/
index.html
room.html
urls.py
views.py

我有consumer.py

from asgiref.sync import async_to_sync
from channels.generic.websocket import WebsocketConsumer
import json

class ChatConsumer(WebsocketConsumer):
def connect(self):
self.room_name = self.scope['url_route']['kwargs']['room_name']
self.room_group_name = 'chat_%s' % self.room_name

# Join room group
async_to_sync(self.channel_layer.group_add)(
self.room_group_name,
self.channel_name
)

self.accept()

def disconnect(self, close_code):
# Leave room group
async_to_sync(self.channel_layer.group_discard)(
self.room_group_name,
self.channel_name
)

# Receive message from WebSocket
def receive(self, text_data):
text_data_json = json.loads(text_data)
message = text_data_json['message']

# Send message to room group
async_to_sync(self.channel_layer.group_send)(
self.room_group_name,
{
'type': 'chat_message',
'message': message
}
)

# Receive message from room group
def chat_message(self, event):
message = event['message']

# Send message to WebSocket
self.send(text_data=json.dumps({
'message': message
}))

这是我的聊天中的routing.py

from django.urls import re_path

from . import consumers

websocket_urlpatterns = [
re_path(r'ws/chat/(?P<room_name>\w+)/$', consumers.ChatConsumer),
]

在我的聊天中>views.py

from django.shortcuts import render

def index(request):
return render(request, 'chat/index.html', {})

def room(request, room_name):
return render(request, 'chat/room.html', {
'room_name': room_name
})

我的聊天应用程序中有 urls.py

从 django.urls 导入路径

from . import views
app_name = 'chat'
urlpatterns = [
path('', views.index, name='index'),
path('<str:room_name>/', views.room, name='room'),
]

我遵循所有方向,我复制粘贴代码,py的位置,turorial中的所有内容,但我仍然收到此错误

enter image description here

我错过了什么吗?

更新

enter image description here

当我在我的 pycharm 终端中尝试这个时docker run -p 6379:6379 -d redis:2.8

enter image description here

最佳答案

这里有一些问题。

1) 您正在混合 asyncsync 消费者代码。

我建议只使用异步消费者,那么所有方法都应该是异步方法。

看起来您正在从同步上下文调用 get_threadget_thread 已包装在 database_sync_to_async 中,因此需要从异步调用上下文(并且需要等待)。

您还需要等待 self.channel_layer.group_add

2) 在您的 ThreadView 中,您有一个 ChatMessage.objects.create,您还应该通过线程 channel 组发送消息。

from channels.layers import get_channel_layer
channel_layer = get_channel_layer()

async_to_sync(channel_layer.group_send)(f"thread_{thread.id}", {"type": "chat.message", "text": ...})

您还需要将聊天消息保存到 websocket_receive 中的数据库中。

关于python - Django WebSocket 断开/ws/聊天/大厅/[127.0.0.1 :3022],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60204574/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com