Websocket 连接在 Django Channels 中不起作用('WebSocket 连接到 'ws://localhost:8000/ws/board/7/' 失败:')

问题描述 投票:0回答:3

我正在尝试为我正在处理的 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 但他们无能为力。

这个问题真的让我很困惑,所以任何帮助将不胜感激! :)

python-3.x django websocket django-channels
3个回答
3
投票

也许您安装了最新的默认通道版本 4,这不会在开发模式下启动 ASGI 服务器。请验证这一点并安装频道版本 == 3.0.5 。当您运行 runserver 命令时,请验证 ASGI 服务器是否启动。

(第 4 版通过 daphne 支持 ASGI 服务器,我想是的,没试过。)

如果不让我知道会讨论更多。


0
投票

你在 settings.py 文件中遗漏了这个

ASGI_APPLICATION = 'appname.asgi.application'

0
投票
  • 对于

    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
    即可使其工作的方法。

© www.soinside.com 2019 - 2024. All rights reserved.