我正在尝试为我正在处理的 Django 项目运行一个 websocket,但我无法连接 websocket,这很奇怪,因为我从中复制了示例聊天应用程序。频道文档并且工作正常但是当我将相同的代码复制粘贴到我的项目时,它没有。
所以,这里是代码的相关部分:
views.py中的相关视图
def board_view(request, key):
board = get_object_or_404(request.user.boards, pk=key)
key = dumps(board.pk)
return render(request, 'core/board.html',
{"board":board, "permission":user_permission, "key":key})
board.html(相关部分)
<script>
const key = JSON.parse("{{key|escapejs}}");
const chatSocket = new WebSocket(
'ws://'
+ window.location.host
+ '/ws/board/'
+ key
+ '/'
);
路由.py
from django.urls import re_path
from . import consumers
websocket_urlpatterns = [
re_path(r"^ws/board/(?P<key>\d+)/$", consumers.ChatConsumer.as_asgi()),
]
消费者.py
import json
from channels.generic.websocket import WebsocketConsumer
class ChatConsumer(WebsocketConsumer):
def connect(self):
self.accept()
self.send(text_data=json.dumps({
'type':'connection_established',
'message':'you are now connected'
}))
def disconnect(self, close_code):
pass
def receive(self, text_data):
text_data_json = json.loads(text_data)
message = text_data_json["message"]
self.send(text_data=json.dumps({"message": message}))
asgi.py
import os
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sketchboard.settings')
django_asgi_app = get_asgi_application()
import core.routing
application = ProtocolTypeRouter({
"http": django_asgi_app,
"websocket": AllowedHostsOriginValidator(
AuthMiddlewareStack(URLRouter(core.routing.websocket_urlpatterns))
),
})
settings.py(相关部分):
ASGI_APPLICATION = 'sketchboard.asgi.application'
和
INSTALLED_MY_APPS = [
'core',
]
INSTALLED_EXTENSIONS = [
'daphne',
'allauth',
'allauth.account',
'allauth.socialaccount',
'guest_user',
'guest_user.contrib.allauth',
'rest_framework',
'channels',
]
这几乎与 channels 文档 中的教程 websocket 设置相同(我尝试时效果很好)。
所以我应该从“board_view”页面上的控制台得到的是“您现在已连接”(如
consumers.py
中所定义),但是我得到了一个
WebSocket connection to 'ws://localhost:8000/ws/board/7/' failed:
消息。
我应该在这里指出,7 是'key',它是一个动态变量,但这部分绝对有效。 我也试过只输入“测试”作为
board.html
和routing.py
中的路线
所以像:
const chatSocket = new WebSocket('ws://' + window.location.host + '/test');
routing.py
或board.html
文件中。
我也试过询问 django discord server 但他们无能为力。
这个问题真的让我很困惑,所以任何帮助将不胜感激! :)
你在 settings.py 文件中遗漏了这个
ASGI_APPLICATION = 'appname.asgi.application'
对于
channels==4.0.0
有一个变化提到here这要求你也把daphne
放在INSTALLED_APPS
中,在django.contrib.staticfiles
之前。也运行 pip install -U 'channels[daphne]' channels-redis
以确保您具有兼容的 daphne
和 channels-redis
版本。
或者,似乎从项目的根目录(
daphne <your main app>.asgi:application
所在的位置)运行 manage.py
而不是 python manage.py runserver
的作品。
此外,如前所述,降级到
channels==3.0.5
是另一种无需将 daphne
添加到您的 INSTALLED_APPS
即可使其工作的方法。