Hello, I have a small question, I have been browsing to find a solution to create a sound notification on my browser, when I receive data in my database via a webshook, I would like to play a sound on my browser when there is new data in my database, but I have not found anything if someone can direct me to a solution a tool that can do this. Thanks!
I’m not really sure what information you’re really looking for here.
Generally speaking, handling audio is something done in the browser with some JavaScript.
Depending upon the range of browsers you need to support, you’ve got a number of options:
-
<audio>
tag sent in an html block via websocket - The Notifications API
- The Push API
- Server-sent events
I know you’re using websockets, so you could probably just send a notification through the socket to tell your JavaScript to play a sound that has already been loaded.
Super thank you very much for this track,
I just raised a problem on my websocket, indeed when I send a post in my app, I filter the data received and I associate them to a user, and so I made several tests, for example if I am connected on user1 and I send a post which is linked to another user, for example user2 I receive the data of user2 on user1, it’s only when I reload the page that each data linked to the user is displayed correctly, in conclusion when I post a data it’s displayed on all the pages of the users and it’s only when I reload the page that the data come back to normal.
(I create another topic for that? or can we stay here ?)
Your choice, I don’t think it’s a problem either way.
okok, but then when do you think?
in my opinion it comes from the view, when I associate my data with an ascount
I’d have to see the consumers and how you’re sending the updates.
If data is getting sent to all connected users when it should only be sent to one user, then you’re not handling the updates appropriately.
its my consumers.py
class HubriseOrderConsumer(ListModelMixin, GenericAsyncAPIConsumer):
def get_queryset(self, **kwargs):
return HubriseOrder.objects.filter(ascount=self.scope["user"]).exclude(
status='En attente').exclude(
status='Rejeter').exclude(
status='Compléter').exclude(
status='new').exclude(
status='Livraison échouer').order_by('created_at')
serializer_class = HubriseOrderSerializer
permissions = (permissions.AllowAny,)
async def connect(self, **kwargs):
await self.model_change.subscribe()
await super().connect()
@model_observer(HubriseOrder)
async def model_change(self, message, observer=None, **kwargs):
await self.send_json(message)
@model_change.serializer
def model_serialize(self, instance, action, **kwargs):
return dict(data=HubriseOrderSerializer(instance=instance).data, action=action.value)
I forgot this my routting.py
from django.urls import re_path
from . import consumers
# websocket_urlpatterns = [re_path(r"^ws/$", consumers.PostConsumer.as_asgi())]
websocket_urlpatterns = [
re_path(r"^ws/$", consumers.HubriseOrderConsumer.as_asgi())]
I’m guessing this “model_observer” is a signal that gets notified whenever a model is changed. That means that yes, every model being changed is going to trigger this signal for every consumer.
uh, you mean for each user instead?
No, if a user doesn’t have an active websocket, they would not see the updates.
If you’ve got 20 users, and 10 of them are logged on and connected, you have 10 active consumers. Changing any instance of any model being monitored (HubriseOrder
?) is going to fire that signal for all 10 consumers.
ah ok you teach me something, I didn’t know it worked like that, what do you recommend to send it to only one user then?
I don’t know enough about your applications architecture to give you any specific advice, but my typical advice against using signals except as a last resort is well documented in the forum here.
Generally speaking, you’ve got a couple different ways to handle this. Your choice would depend upon what information you have at which points in time to identify who should receive a message.
Personally, I use django-channels-presence (patched to work with current Django) for this type of situation. Each user who connects is joined to a Room
, which works like a Channels group, except it tracks who is connected. You can then query the Room
model to get the specific channel for a connected user and direct a message to them.
there is just the documentation for the installation ? I have searched but I can’t find any doc to configure this
just install it? django-channels-presence
I finished configuring my consumer, but when I run it, I get this error I think there is a compatibility problem with another package.
PS C:\Users\Abder-Rahmanhe\Desktop\Django\Orderline APP\OrderLineApp> python manage.py runserver
Watching for file changes with StatReloader
Exception in thread django-main-thread:
Traceback (most recent call last):
File "C:\Users\Abder-Rahmanhe\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\django\apps\config.py", line 245, in create
app_module = import_module(app_name)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.2288.0_x64__qbz5n2kfra8p0\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1004, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'rooms'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.2288.0_x64__qbz5n2kfra8p0\lib\threading.py", line 1016, in _bootstrap_inner
self.run()
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.2288.0_x64__qbz5n2kfra8p0\lib\threading.py", line 953, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\Abder-Rahmanhe\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\django\utils\autoreload.py", line 64, in wrapper
fn(*args, **kwargs)
File "C:\Users\Abder-Rahmanhe\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\django\core\management\commands\runserver.py", line 125, in inner_run
autoreload.raise_last_exception()
File "C:\Users\Abder-Rahmanhe\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\django\utils\autoreload.py", line 87, in raise_last_exception
raise _exception[1]
File "C:\Users\Abder-Rahmanhe\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\django\core\management\__init__.py", line 398, in execute
autoreload.check_errors(django.setup)()
File "C:\Users\Abder-Rahmanhe\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\django\utils\autoreload.py", line 64, in wrapper
fn(*args, **kwargs)
File "C:\Users\Abder-Rahmanhe\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\django\__init__.py", line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "C:\Users\Abder-Rahmanhe\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\django\apps\registry.py", line 91, in populate
app_config = AppConfig.create(entry)
File "C:\Users\Abder-Rahmanhe\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\django\apps\config.py", line 247, in create
raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: Cannot import 'rooms'. Check that 'channels_presence.apps.RoomsConfig.name' is correct.
That’s interesting, I’ve never seen it throw that error before. (I’ve never tried to use it in Windows before, either.)
Did you fix the syntax error in channels_presence.signals ?
I don’t see in the channels_presence.signals
logs, where is it exactly?