Senden einer Nachricht an einen einzelnen Benutzer über django-channels

8

Ich habe django-channels ausprobiert, einschließlich der Dokumente gelesen und mit den Beispielen herumgespielt.

>

Ich möchte eine Nachricht an einen einzelnen Benutzer senden können, die durch das Speichern einer neuen Instanz in einer Datenbank ausgelöst wird.

Mein Anwendungsfall ist das Erstellen einer neuen Benachrichtigung (über eine Sellerie-Aufgabe) und, sobald die Benachrichtigung gespeichert wurde, das Senden dieser Benachrichtigung an einen einzelnen Benutzer.

Das klingt wie es möglich ist (aus den django-channels docs )

  

... der entscheidende Teil ist, dass Sie Code ausführen können (und so weiterleiten)   Kanäle) als Reaktion auf ein Ereignis - und dazu gehören auch Sie   erstellen. Sie können bei Modellspeicherungen, bei anderen eingehenden Nachrichten oder   aus Codepfaden in Ansichten und Formularen.

Aber wenn ich die Docs weiter lese und mit den Django-Channel-Beispielen herumspiele, kann ich nicht sehen, wie ich kann dies tun. Die Databinding- und Liveblog-Beispiele demonstrieren das Senden an eine Gruppe, aber ich kann nicht sehen, wie man nur an einen einzelnen Benutzer sendet.

Irgendwelche Vorschläge würden sehr geschätzt werden.

    
luke_aus 04.09.2016, 23:10
quelle

3 Antworten

10

Erweiterung auf @ Flip's Antwort zum Erstellen einer Gruppe für diesen bestimmten Benutzer.

In Ihrer Python-Funktion in Ihrer ws_connect-Funktion können Sie diesen Benutzer nur für sie in eine Gruppe aufnehmen:

consumers.py

%Vor%

Um diesem Benutzer eine Nachricht von Ihrem Python-Code zu senden:

meine view.py

%Vor%

Wenn sie verbunden sind, erhalten sie die Nachricht. Wenn der Benutzer nicht mit einem Websocket verbunden ist, wird es automatisch fehlschlagen.

Sie müssen außerdem sicherstellen, dass Sie nur einen Benutzer mit der Gruppe jedes Benutzers verbinden. Anderenfalls könnten mehrere Benutzer eine Nachricht erhalten, die nur für einen bestimmten Benutzer bestimmt ist.

Sehen Sie sich django channels-Beispiele an, insbesondere multihat für die Implementierung von Routing, Erstellen die Websocket-Verbindung auf der Clientseite und Einrichten von django_channels.

Schauen Sie sich auch die django channels docs an.

    
luke_aus 23.09.2016, 19:28
quelle
2

Der beste Ansatz besteht darin, die Gruppe für diesen bestimmten Benutzer zu erstellen. Wenn Sie ws_connect verwenden, können Sie diesen Benutzer zu Group("%s" % <user>).add(message.reply_channel)

hinzufügen
  

Hinweis: Meine Websocket-URL ist ws://127.0.0.1:8000/<user>

    
Raja Simon 09.09.2016 06:34
quelle
0

Um die Antwort von @ luke_aus zu erweitern, können Sie, wenn Sie mit ResourceBindings arbeiten, auch so einstellen, dass nur Benutzer, die ein Objekt "besitzen", Updates für diese abrufen:

Genau wie @lukes_aus antworten wir registrieren den Benutzer zu seiner eigenen Gruppe, wo wir Aktionen ( update , create ) usw. veröffentlichen können, die nur für diesen Benutzer sichtbar sein sollten:

%Vor%

Jetzt können wir die entsprechende Bindung ändern, so dass sie nur Änderungen veröffentlicht, wenn das gebundene Objekt zu diesem Benutzer gehört, unter der Annahme eines Modells wie folgt:

%Vor%

Jetzt können wir dieses Modell an unsere Benutzergruppe binden und alle Aktionen (update, create, etc.) werden nur für diesen einen Benutzer veröffentlicht:

%Vor%     
devsnd 06.09.2017 12:04
quelle

Tags und Links