Django 频道 - 未找到:/ws/stock/track/

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

我正在关注此视频,但我没有得到与视频中相同的控制台输出。

我的控制台输出:

[20/Feb/2024 19:09:12] "GET /stocktracker/?stockpicker=AAPL&stockpicker=AMGN HTTP/1.1" 200 6449
Not Found: /ws/stock/track/
[20/Feb/2024 19:09:12] "GET /ws/stock/track/?stockpicker=AAPL&stockpicker=AMGN HTTP/1.1" 404 2613

本地站点上的控制台输出(使用 py manage.py runserver):

stockpicker=AAPL&stockpicker=AMGN

stocktracker/?stockpicker=AAPL&stockpicker=AMGN:176 WebSocket connection to 'ws://127.0.0.1:8000/ws/stock/track/?stockpicker=AAPL&stockpicker=AMGN' failed: 
(anonymous) @ stocktracker/?stockpicker=AAPL&stockpicker=AMGN:176

asgi.py:

"""
ASGI config for backend project.

It exposes the ASGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/
"""

import os

from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
from channels.auth import AuthMiddlewareStack
from Tradingapp.routing import websocket_urlpatterns

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
# Initialize Django ASGI application early to ensure the AppRegistry
# is populated before importing code that may import ORM models.
django_asgi_app = get_asgi_application()

application = ProtocolTypeRouter({
    "http": django_asgi_app,
    # Just HTTP for now. (We can add other protocols later.)
    "websocket": AuthMiddlewareStack(
      URLRouter(
        websocket_urlpatterns
      )
    )
})

路由.py:

from django.urls import re_path

from . import consumers

websocket_urlpatterns = [
    # Celery data is sent to a "group" and this group has multiple users
    #to listen for the same thing via websockets
    re_path(r'ws/stock/(?P<room_name>\w+)/$', consumers.StockConsumer.as_asgi()),
]

JS连接:

    const roomName = JSON.parse(document.getElementById('room-name').textContent)
    var queryString = window.location.search
    queryString = queryString.substring(1)
    console.log(queryString)
    const stockSocket = new WebSocket('ws://' + window.location.host + '/ws/stock/' + roomName + '/' + '?' + queryString)

consumers.py:

import json

from channels.generic.websocket import AsyncWebsocketConsumer


class StockConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        self.room_name = self.scope["url_route"]["kwargs"]["room_name"]
        self.room_group_name = f"stock_{self.room_name}"

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

        await self.accept()

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

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

        # Send message to room group
        await self.channel_layer.group_send(
            self.room_group_name, {"type": "stock_update", "message": message}
        )

    # Receive message from room group
    async def stock_update(self, event):
        message = event["message"]

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

settings.py 中的CHANNEL_LAYERS:

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

我查看了其他堆栈溢出问题,像这个问题,但我找不到对我有帮助的解决方案

python django websocket redis django-channels
1个回答
0
投票

我在 Django Discord 中提问,一位名叫 Vaarun 的好心人帮助我解决了我的问题;我没有在我安装的应用程序中安装 Daphne。

不工作

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'Tradingapp',
    'corsheaders',
    'rest_framework',
    'django_celery_results',
    'django_celery_beat',
    'channels',
]

工作中

INSTALLED_APPS = [
    'daphne',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'Tradingapp',
    'corsheaders',
    'rest_framework',
    'django_celery_results',
    'django_celery_beat',
    'channels',
]

确保也运行

pip install daphne

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