Я новичок в каналах Django, пытающихся реализовать HTTP Long Polling.
Я попробовал задокументированный пример здесь , но, похоже, он не работает.
class LongPollConsumer(AsyncHttpConsumer):
async def handle(self, body):
self.room_name = self.scope['url_route']['kwargs']['uuid']
self.room_group_name = 'upvote_'
# await self.send_response(200, b"Hello", headers=[
# (b"Content-Type", b"application/json"),
# ])
await self.send_headers(headers=[
(b"Content-Type", b"application/json"),
])
print('consumer room_name', self.room_group_name)
async_to_sync(self.channel_layer.group_add)(
self.room_group_name,
self.channel_name
)
# Headers are only sent after the first body event.
# Set "more_body" to tell the interface server to not
# finish the response yet:
await self.send_body(b"i", more_body=True)
async def upvote_message(self, event):
# Send JSON and finish the response:
# async_to_sync(self.channel_layer.group_discard)(
# self.room_group_name,
# self.channel_name
# )
print('inside....upvote_message')
await self.send_body(json.dumps(event).encode("utf-8"))
и из моего views.py я звоню:
room_group_name = 'upvote_'
channel_layer = get_channel_layer()
async_to_sync(channel_layer.group_send)(
room_group_name, {
"type": "upvote.message",
"message": {
'actionType': 'WS_NEW_EVENT_RECEIVED',
'data': {}
}
}
)
Он печатает consumer room_name upvote_
, как только запрос отправлен, и запрос все еще открыт, что и должно быть, но ответ абсолютно ничего. Я использую Почтальон для проверки конечной точки длинного опроса.
Мои вопросы:
Является ли тип в views.py правильным? Я также попробовал upvote_message
, что, похоже, тоже не работает.
Как закрыть соединение с сервера, отправив пустой ответ при достижении максимального времени ожидания?
Правильно ли я тестирую конечную точку длинного опроса? Если нет, пожалуйста, кратко опишите в ответе, как это сделать.