Каналы django: отправьте my_response для нескольких URL через self.channel_layer.group_send () - PullRequest
0 голосов
/ 10 ноября 2019

Я использую 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

или есть какой-либо другой способ обновить другой шаблон, когда я отправляю новое сообщение в моей комнате чата?

...