Я довольно новичок в django-channel и python, я делаю демонстрацию, используя django-channel и django для активной отправки данных из бэкэнда на фронт.код в consumer.py, как показано ниже:
websocket_clients = []
class WebsocketConsumer(AsyncWebsocketConsumer):
def __init__(self, *args, **kwargs):
"""
initial a new thread when new websocket instance initialed.
"""
super(WebsocketConsumer, self).__init__(self)
self.index_websocket = GendataThread()
async def connect(self):
self.index_websocket.channels_name = self.channel_name
print('channel_name', self.channel_name)
self.index_websocket.start()
websocket_clients.append(self.channel_name)
await self.accept()
async def disconnect(self, close_code):
"""disconnected a websocket instance, and stop the thread."""
self.index_websocket.stop()
time.sleep(2)
index = websocket_clients.index(self.channel_name)
websocket_clients.pop(index)
async def receive(self, text_data):
"""receive message from connected client, wouldn't work in this project."""
text_data = '{"message": "%s"}' % (text_data)
text_data_json = json.loads(text_data)
async def chat_message(self, event):
"""send message to websocket."""
print('event', event)
await self.send(text_data=json.dumps(
{'message': event['message']}))
def websocket_send_data(data, channel_name):
"""
send data to front in websocket protocol,
:param data: data which will be sent,
:param channel_name: a symbol to mark connected client.
:return:
"""
channel_layer = get_channel_layer()
event = {
"type": "chat.message",
"message": data
}
async_to_sync(channel_layer.send)(channel_name, event)
, как вы можете видеть, я создаю имя функции: websocket_send_data (data, channel_name), которую я могу вызвать в GendataThread (), как показано ниже:
class GendataThread(threading.Thread):
"""new thread
thread for getting data from cluster, and send to front with websocket protocol.
"""
def __init__(self, *args, **kwargs):
super(GendataThread, self).__init__(*args, **kwargs)
self.channels_name = None
def run(self):
while true:
websocker_send_data('1', self.channels_name)
в этом случае я могу отправлять данные из бэкэнда на фронт во время работы проекта django, я подключаюсь к URL
ws://127.0.0.1:8000/ws/intime_data
, который установлен в routing.py, как показано ниже:
websocket_urlpatterns = [
url(r'^ws/intime_data$', consumers.WebsocketConsumer),
]
Я могу получать данные спереди, но, поскольку он работает несколько минут, все идет не так:
aioredis.errors.ReplyError: OOM command not allowed when used memory > 'maxmemory'.
Я думаю, это потому, что redis переполнен сохранением данных, но я неМне не нужны эти данные, я пытаюсь настроить redis.conf:
maxmemory-policy allkeys-lru
, но при использовании maxmemory все равно возникает ошибка.и иногда появляется такая ошибка:
channels.exceptions.Channels Full
Я думаю, что каналы используют redis в качестве кэша, но я не знаю, почему появляются ошибки, кто-нибудь может мне помочь?заранее спасибо.