Использование Django Channels (потребитель уровня websocket) для обновления веб-страницы данными из внутренней базы данных и внешнего источника данных
У меня есть следующий класс django channels, который обновляет значения на веб-странице. Класс получает данные от нажатий на экран, выполняет действия (переключение индикаторных реле или установка их серии для определенного использования, обновление базы данных и затем обновление веб-страницы через уровень websocket. Все это прекрасно работало, пока я не представил nina. Она получает данные из удаленного источника через curl POST (см. ниже). Curl POST приводит к отказу: 'TypeError: nina() missing 1 required positional argument: 'request', но если я уберу 'self', то не понимаю, как я могу вызвать 'update_relays', используя его данные.
curl -X POST awebsite.com/dome_control/nina/ -H "Content-Type: application/json" -d '{"type": "curl.receive", "text": "power on"}'
OK Итак, ответ заключается в "совместном использовании" слоя_канала
@csrf_exempt
def nina(request):
"""RECEIVES DATA FROM NINA"""
logger.info("request received from nina: %s", request)
logger.info("data %s", json.loads(request.body))
incoming_msg = json.loads(request.body)["text"]
channel_layer = get_channel_layer()
async_to_sync(channel_layer.group_send)(
"dome_control_group",
{'type': 'websocket.receive', 'text': incoming_msg}
)
return JsonResponse({'status': 'ok'})
Также была допущена ошибка в запросе curl (отсутствие / в конце url)
curl -X POST https://mywebsiteaddress/dome_control/nina/ -H "Content-Type: application/json" -d '{"type": "curl.receive", "text": "power on"}'