В функции EventConsumer() отсутствуют 2 обязательных позиционных аргумента: 'receive' и 'send', при использовании AsyncWebSocketConsumer

Проблема в том, что я не понимаю, почему он запрашивает 2 позиционных аргумента здесь, и я не видел никакой другой подобной проблемы. Были предложения обновить библиотеку 'channels', или действительно добавить функции 'send' и 'receive' в мой Consumers class. Но ни то, ни другое никак не повлияло на мой код. Я пробовал различные варианты маршрутизации, настройки asgi или конфигурации Docker-compose и nginc.config файлов. Но все равно ничего не помогает. Идея в том, что я просто хочу, чтобы мой WebSocket посылал мне события, которые сохранены в событиях из POST, или которые вот-вот будут сохранены. Вот мой consumers.py:

from channels.generic.websocket import AsyncWebsocketConsumer
from .models import (
    WorkingMode,
    CarParkItem,
    Events
)
import json

class EventConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        await self.accept()
        await self.channel_layer.group_add("events", self.channel_name)
        print("Connected to events")

    async def disconnect(self, close_code):
        await self.channel_layer.group_discard("events", self.channel_name)
        print("Disconnected from events")

    async def receive(self, text_data):
        text_data_json = json.loads(text_data)
        cam_id = text_data_json['cam_id']
        vehicle_plate = text_data_json['vehicle_plate']
        is_recognition = text_data_json['is_recognition']
        is_confirmation = text_data_json['is_confirmation']

        working_mode = WorkingMode.objects.get(pk=cam_id)
        event_code = None

        if working_mode.pass_mode == 'closed':
            event_code = 1009
        else:
            car_park_item = CarParkItem.objects.filter(vehicle_plate=vehicle_plate).first()
            if car_park_item:
                event_code = 1008
            else:
                if is_recognition and is_confirmation:
                    event_code = 1007
                elif is_recognition and not is_confirmation:
                    event_code = 1006
                elif not is_recognition and not is_confirmation:
                    event_code = 1003
                elif vehicle_plate:
                    event_code = 1008

        event = {
            'cam_id': cam_id,
            'vehicle_plate': vehicle_plate,
            'is_recognition': is_recognition,
            'is_confirmation': is_confirmation,
            'event_code': event_code
        }

        await self.create_event(event)

    async def create_event(self, event):
        event = Events.objects.create(
            cam_id=event['cam_id'],
            vehicle_plate=event['vehicle_plate'],
            is_recognition=event['is_recognition'],
            is_confirmation=event['is_confirmation'],
            event_code=event['event_code']
        )
        await self.channel_layer.group_send(
            "events",
            {
                'type': 'event_message',
                'event': event.to_dict()
            }
        )

    async def event_message(self, event):
        await self.send(text_data=json.dumps({
            'event': event
        }))

asgi.py:

from channels.generic.websocket import AsyncWebsocketConsumer
from .models import (
    WorkingMode,
    CarParkItem,
    Events
)
import json

class EventConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        await self.accept()
        await self.channel_layer.group_add("events", self.channel_name)
        print("Connected to events")

    async def disconnect(self, close_code):
        await self.channel_layer.group_discard("events", self.channel_name)
        print("Disconnected from events")

    async def receive(self, text_data):
        text_data_json = json.loads(text_data)
        cam_id = text_data_json['cam_id']
        vehicle_plate = text_data_json['vehicle_plate']
        is_recognition = text_data_json['is_recognition']
        is_confirmation = text_data_json['is_confirmation']

        working_mode = WorkingMode.objects.get(pk=cam_id)
        event_code = None

        if working_mode.pass_mode == 'closed':
            event_code = 1009
        else:
            car_park_item = CarParkItem.objects.filter(vehicle_plate=vehicle_plate).first()
            if car_park_item:
                event_code = 1008
            else:
                if is_recognition and is_confirmation:
                    event_code = 1007
                elif is_recognition and not is_confirmation:
                    event_code = 1006
                elif not is_recognition and not is_confirmation:
                    event_code = 1003
                elif vehicle_plate:
                    event_code = 1008

        event = {
            'cam_id': cam_id,
            'vehicle_plate': vehicle_plate,
            'is_recognition': is_recognition,
            'is_confirmation': is_confirmation,
            'event_code': event_code
        }

        await self.create_event(event)

    async def create_event(self, event):
        event = Events.objects.create(
            cam_id=event['cam_id'],
            vehicle_plate=event['vehicle_plate'],
            is_recognition=event['is_recognition'],
            is_confirmation=event['is_confirmation'],
            event_code=event['event_code']
        )
        await self.channel_layer.group_send(
            "events",
            {
                'type': 'event_message',
                'event': event.to_dict()
            }
        )

    async def event_message(self, event):
        await self.send(text_data=json.dumps({
            'event': event
        }))

routing.py:

''' from django.urls import re_path from . import consumers websocket_urlpatterns = [ re_path(r'ws/path/$', consumers.EventConsumer.as_asgi()) '''

и settings.py:

ASGI_APPLICATION = 'django_ws.settings.asgi.application'

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels.layers.InMemoryChannelLayer',
        }
    },

вот дерево моих проектов:

── backend
│   ├── config
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   ├── asgi.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   ├── manage.py
│   ├── requirements.txt
│   └── service
│       ├── __init__.py
│       ├── __pycache__
│       ├── admin.py
│       ├── apps.py
│       ├── consumers.py
│       ├── migrations
│       ├── models.py
│       ├── routing.py
│       ├── shemas.py
│       ├── tests.py
│       ├── urls.py
│       └── views.py

Я обновил свои библиотеки, внес исправления в requirements.txt, а также исправил свой nginx.config файл. Буквально ни одно сообщение, которое я видел с подобной проблемой, не помогло. Также я уверен, что проблема не в моем docker-compose файле, и не в моем nginx.config файле. Но если это будет необходимо - просто скажите мне. Большое спасибо за внимание.

Вернуться на верх