В функции 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
файле. Но если это будет необходимо - просто скажите мне. Большое спасибо за внимание.