Я использую 2 канала django для личного чата. И после того, как я потратил МНОГО ВРЕМЕНИ, у меня просто нет другого решения для моей проблемы, у меня есть два html-файла: inbox.html показывает список всей истории пользователей, с которыми я общался с ними, и он упорядочен по последнему обновленному времени (последнееобщаться с каждым пользователем), и если вы нажмете на одного из них, то вы увидите другой файл, показывающий комнату чата. Я хочу использовать свой ChatConsumer для двух URL.
Я отправляю my_response в функцию websocket_receive, а затем получаю его в socket.onmessage в шаблоне
ПРОБЛЕМА ЕСТЬ Я не могу сделать это для обоих URL.
Я хочу отправить его и в свой почтовый ящик, потому что я хочу переупорядочивать списки пользователей чата каждый раз, когда я отправляю сообщение. Поэтому я создал группу для входящих сообщений в моих потребителях, как я сделал это для своего chat_room в websocket_connectфункция:
inbox_room = f"inbox_{me.id}"
self.inbox_room=inbox_room
await self.channel_layer.group_add(
inbox_room,
self.channel_name
)
и затем я попробовал два способа: 1- просто использовать channel_layer.group_send для обоих из них:
await self.channel_layer.group_send(
self.chat_room,
self.inbox_room,
{
"type": "chat_message",
"text": json.dumps(my_response)
}
)
и затем используя:
async def chat_message(self,event):
await self.send({
"type": "websocket.send",
"text":event['text']
})
это дает мне ошибку:
group_send() takes 3 positional arguments but 4 were given
2-Если кодировать его дважды для каждой из групп, как это:
await self.channel_layer.group_send(
self.chat_room,
{
"type": "chat_message",
"text": json.dumps(my_response)
}
)
await self.channel_layer.group_send(
self.inbox_room,
{
"type": "inbox_messages",
"text": json.dumps(my_response)
}
)
, а затем две функции для отправки их обеих:
async def chat_message(self,event):
await self.send({
"type": "websocket.send",
"text":event['text']
})
async def inbox_messages(self, event):
await self.send({
"type": "websocket.send",
"text": event['text']
})
В результате в моем чате появилось дублированное сообщение, и я снова не могу использовать его для своей папки входящих сообщений.
Мой скрипт в inbox.html:
{% block more_js %}
<script src="http://cdnjs.cloudflare.com/ajax/libs/moment.js/2.13.0/moment.min.js"> //for Using moment.js </script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/reconnecting-websocket/1.0.0/reconnecting-websocket.min.js'>
// for using reconnectingWebsocket
</script>
<script>
var loc = window.location
var wsStart = 'ws://'
if(loc.protocol == 'https:'){
wsStart ='wss://'
}
var endpoint = wsStart + loc.host + loc.pathname
var socket = new ReconnectingWebSocket(endpoint) {# Reconnecting #}
//message i recieve
socket.onmessage = function(e){
console.log("message",e)
var chatDataMsg = JSON.parse(e.data)
{############# INBOX UPDATE ###########}
{####change time####}
$(`#chatter-${chatDataMsg.thread_id}`)[0].innerHTML=(moment(chatDataMsg.timestamp).format('MMM. D, Y, h:mm a') )
console.log(chatDataMsg.thread_id)
var chatters = $(".chatter");
console.log(chatters)
var cc = chatters.sort(function(a,b){
var a_time = new Date(( moment($(`#chatter-${a.attributes.id.value}`)[0].innerHTML,'MMM. D, Y, h:mm a').format('YYYY/MM/DD hh:mm:ss')))
var b_time = new Date(( moment($(`#chatter-${b.attributes.id.value}`)[0].innerHTML,'MMM. D, Y, h:mm a').format('YYYY/MM/DD hh:mm:ss')))
return a_time < b_time
})
console.log(cc)
cc.detach()
$("#inbox-items").append(chatters)
}
socket.onopen = function(e) {
console.log("open", e)
}
socket.onerror = function(e){
console.log("error",e)}
socket.onclose = function(e){
console.log("close",e)}
</script>
{% endblock %}
Я скопировал их из частей моего messaging.html, которые были необходимы дляобновляя входящие, но в сообщениях есть другие коды для добавления в чат и другие вещи.
Я хочу знать, как действительно использовать мой потребитель для обоих URL, потому что в документации сказано, что у меня может быть routing.py, например так:
URLRouter([
url(r"^longpoll/$", LongPollConsumer),
url(r"^notifications/(?P<stream>\w+)/$", LongPollConsumer),
url(r"", AsgiHandler),
])
ссылка на документацию для маршрутизации: https://channels.readthedocs.io/en/latest/topics/routing.html
и мой routing.py
application = ProtocolTypeRouter({
'websocket':AllowedHostsOriginValidator(
AuthMiddlewareStack(
URLRouter(
[ url(r"^messages/$", ChatConsumer),
url(r"^messages/(?P<username>[\w.@+-]+)/$",ChatConsumer),
]
)
)
)
})
, поэтому должен быть правильный способ его использования и, возможно,Я не знаю, потому что я новичок в каналах, и у меня действительно есть проблема с javascript
или есть какой-либо другой способ обновить другой шаблон, когда я отправляю новое сообщение в моей комнате чата?