Django Channels 组发送不会向组发送任何数据

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

我的 websocket 可以工作,但没有向群组发送任何数据

# settings.py

INSTALLED_APPS = [
    'daphne',
    # admin interface
    'jet',
    # django apps
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 3rd party
    'django_otp',
    'django_otp.plugins.otp_totp',
    'drf_spectacular',
    'rest_framework',
    'multiselectfield',
    'django_celery_results',
    'django_celery_beat',
    'channels',
    # my apps
    "ads",
    "authentication",
]

# WSGI_APPLICATION = 'gozle_ads.wsgi.application'
ASGI_APPLICATION = 'gozle_ads.asgi.application'


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


# consumers.py

import json

from asgiref.sync import async_to_sync

from channels.generic.websocket import WebsocketConsumer


class BannerConsumer(WebsocketConsumer):
    def connect(self):
        self.accept()
        
        self.room_name = "banner_changer"
        self.room_group_name = "banner_changer_group"

        async_to_sync(self.channel_layer.group_add)(
            self.room_name, self.room_group_name
        )
        self.send(json.dumps({"messgae": "Connected to the banner websocket"}))

    def receive(self, text_data=None):
        async_to_sync(self.channel_layer.group_send)(
            "banner_changer_group",
            {
                "type": "banner_ads_socket",
                "value": f"{text_data}"
            }
        )
    
    def disconnect(self, code):
        print("DISCONNECTED")

    def banner_ads_socket(self, event):
        print("BANNER ADS")
        print(event)


# asgi.py

import os

from django.core.asgi import get_asgi_application
from django.urls import re_path

from channels.routing import ProtocolTypeRouter, URLRouter

from ads.consumers import BannerConsumer

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'gozle_ads.settings')

ws_patterns = [
    re_path(r"ws/banner/", BannerConsumer.as_asgi())
]


application = ProtocolTypeRouter({
        "http": get_asgi_application(),
        "websocket": URLRouter(ws_patterns),
})

当我向

receive
方法发送数据时,没有任何反应,方法
banner_ads_socket
不起作用。它不会引发任何错误。首先,我将消费者添加到我的组中,然后将数据发送到该组。我从视频里复制的。在此代码中有效,但我的代码无效。我能用它做什么?

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

这可能是由于

self.room_name
self.room_group_name
connect
中分配以及在
group_add
group_send
中引用的方式所致。

您应该使用

room_group_name
来添加群组和发送消息,即

async_to_sync(self.channel_layer.group_add)(self.room_group_name, self.channel_name)

来源:https://ioflood.com/blog/django-framework-python-tutorial/#Django_in_Real-World_Projects

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