I even made sure to read the docs multiple times before posting. :/
I've been reading about Redis, and since I got windows OS, I installed the
port for Windows based redis <https://github.com/MicrosoftArchive/redis>,
tested the server and client they are working ok
<https://i.imgur.com/78Ycvvj.jpg>.
# settings.py
# ...
ASGI_APPLICATION = 'djangoChannels.routing.application'
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [("localhost", 6379)],
},
},
}
# consumers.py
from asgiref.sync import AsyncToSync
from channels.generic.websocket import WebsocketConsumer
class ChatConsumer(WebsocketConsumer):
def connect(self):
AsyncToSync(self.channel_layer.group_add)("chat", self.channel_name)
def disconnect(self):
AsyncToSync(self.channel_layer.group_discard)("chat", self
.channel_name)
raises an exception
[2018/02/03 08:30:19] WebSocket HANDSHAKING /sessions/ [127.0.0.1:12778]
> ERROR:root:Exception inside application: There is no current event loop in
> thread 'Thread-3'.
> File "c:\python35\Lib\asyncio\tasks.py", line 241, in _step
> result = coro.throw(exc)
> File
> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\channels\consumer.py",
>
> line 51, in __call__
> await await_many_dispatch([receive, self.channel_receive],
> self.dispatch)
> File
> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\channels\utils.py",
> line 48, in await_many_dispatch
> await dispatch(result)
> File
> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\asgiref\sync.py",
> line 84, in inner
> return await async_func(*args, **kwargs)
> File
> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\asgiref\sync.py",
> line 67, in __call__
> return await asyncio.wait_for(future, timeout=None)
> File "c:\python35\Lib\asyncio\tasks.py", line 367, in wait_for
> return (yield from fut)
> File "c:\python35\Lib\asyncio\futures.py", line 358, in __iter__
> yield self # This tells Task to wait for completion.
> File "c:\python35\Lib\asyncio\tasks.py", line 290, in _wakeup
> future.result()
> File "c:\python35\Lib\asyncio\futures.py", line 274, in result
> raise self._exception
> File "c:\python35\Lib\concurrent\futures\thread.py", line 55, in run
> result = self.fn(*self.args, **self.kwargs)
> File
> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\asgiref\sync.py",
> line 76, in thread_handler
> raise e
> File
> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\asgiref\sync.py",
> line 74, in thread_handler
> self.func(*args, **kwargs)
> File
> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\channels\consumer.py",
>
> line 93, in dispatch
> handler(message)
> File
> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\channels\generic\websocket.py",
>
> line 19, in websocket_connect
> self.connect()
> File
> "D:\Programming\DjangoWebsite\HUWebsite\husite\djangoChannels\djangoChannels\consumers.py",
>
> line 7, in connect
> AsyncToSync(self.channel_layer.group_add)("chat", self.channel_name)
> File
> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\asgiref\sync.py",
> line 17, in __init__
> self.main_event_loop = asyncio.get_event_loop()
> File "c:\python35\Lib\asyncio\events.py", line 626, in get_event_loop
> return get_event_loop_policy().get_event_loop()
> File "c:\python35\Lib\asyncio\events.py", line 572, in get_event_loop
> % threading.current_thread().name)
> There is no current event loop in thread 'Thread-3'.
>
Thanks for what you did so far!
On Saturday, February 3, 2018 at 6:58:56 AM UTC+2, Andrew Godwin wrote:
>
> The docs do mention this in a big callout at the top of the Channel Layers
> page :)
> http://channels.readthedocs.io/en/latest/topics/channel_layers.html
>
> Andrew
>
> On Fri, Feb 2, 2018 at 8:52 PM, Ahmed Magdy <[email protected]
> <javascript:>> wrote:
>
>> Aha thanks for making it clear, I will read more about redis then.
>> Shouldn't the docs mention that though?
>>
>> On Saturday, February 3, 2018 at 6:47:47 AM UTC+2, Andrew Godwin wrote:
>>>
>>> No, there is no in-memory channel layer any more, only Redis is
>>> available at the moment. You must put something into the settings in order
>>> to make it function.
>>>
>>> Andrew
>>>
>>> On Fri, Feb 2, 2018 at 8:42 PM, Ahmed Magdy <[email protected]> wrote:
>>>
>>>> I thought it uses in memory channel layer by default if it's empty? I
>>>> didn't try setting a value, because only redis was available in v2.0.0 and
>>>> I don't like using stuff I don't understand.
>>>>
>>>> On Saturday, February 3, 2018 at 6:08:02 AM UTC+2, Andrew Godwin wrote:
>>>>>
>>>>> It needs to contain a value to work - what value were you trying that
>>>>> was not empty?
>>>>>
>>>>> Andrew
>>>>>
>>>>> On Fri, Feb 2, 2018 at 8:04 PM, Ahmed Magdy <[email protected]>
>>>>> wrote:
>>>>>
>>>>>> I tried not having CHANNEL_LAYERS or setting it to {}
>>>>>> same exception
>>>>>>
>>>>>> On Saturday, February 3, 2018 at 3:36:43 AM UTC+2, Andrew Godwin
>>>>>> wrote:
>>>>>>>
>>>>>>> Do you have a CHANNEL_LAYERS setting in your settings file? If so,
>>>>>>> what is it set to?
>>>>>>>
>>>>>>> Andrew
>>>>>>>
>>>>>>> On Fri, Feb 2, 2018 at 5:17 PM, Ahmed Magdy <[email protected]>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> That's what I did after reading the documentation here's how my
>>>>>>>> channels files look like
>>>>>>>>
>>>>>>>> # settings.py
>>>>>>>> # ...
>>>>>>>> ASGI_APPLICATION = 'djangoChannels.routing.application'
>>>>>>>> # ...
>>>>>>>>
>>>>>>>> # routing.py
>>>>>>>> from django.conf.urls import url
>>>>>>>>
>>>>>>>> from channels.routing import ProtocolTypeRouter, URLRouter
>>>>>>>> from channels.auth import AuthMiddlewareStack
>>>>>>>>
>>>>>>>> from .consumers import ChatConsumer
>>>>>>>>
>>>>>>>> application = ProtocolTypeRouter({
>>>>>>>> # Empty for now (http->django views is added by default)
>>>>>>>> 'websocket': AuthMiddlewareStack(
>>>>>>>> URLRouter([
>>>>>>>> url('^sessions/$', ChatConsumer)
>>>>>>>> ])
>>>>>>>> )
>>>>>>>> })
>>>>>>>>
>>>>>>>> # consumers.py
>>>>>>>> from asgiref.sync import AsyncToSync
>>>>>>>> from channels.generic.websocket import WebsocketConsumer
>>>>>>>>
>>>>>>>> class ChatConsumer(WebsocketConsumer):
>>>>>>>>
>>>>>>>> def connect(self):
>>>>>>>> AsyncToSync(self.channel_layer.group_add)("chat", self
>>>>>>>> .channel_name)
>>>>>>>>
>>>>>>>> def disconnect(self):
>>>>>>>> AsyncToSync(self.channel_layer.group_discard)("chat", self
>>>>>>>> .channel_name)
>>>>>>>>
>>>>>>>>
>>>>>>>> After connecting with JS websocket to
>>>>>>>>
>>>>>>>> ws://127.0.0.1:8000/sessions/
>>>>>>>>>
>>>>>>>>
>>>>>>>> Raises an exception
>>>>>>>>
>>>>>>>> Performing system checks...
>>>>>>>>>
>>>>>>>>> System check identified no issues (0 silenced).
>>>>>>>>> February 03, 2018 - 03:14:29
>>>>>>>>> Django version 2.0.2, using settings 'djangoChannels.settings'
>>>>>>>>> Starting ASGI/Channels development server at
>>>>>>>>> http://127.0.0.1:8000/
>>>>>>>>> Quit the server with CTRL-BREAK.
>>>>>>>>> 2018-02-03 03:14:29,799 - INFO - server - HTTP/2 support not
>>>>>>>>> enabled (install the http2 and tls Twisted extras)
>>>>>>>>> 2018-02-03 03:14:29,800 - INFO - server - Listening on endpoint
>>>>>>>>> tcp:port=8000:interface=127.0.0.1
>>>>>>>>> [2018/02/03 03:14:32] WebSocket HANDSHAKING /sessions/ [
>>>>>>>>> 127.0.0.1:8631]
>>>>>>>>> ERROR:root:Exception inside application: 'NoneType' object has no
>>>>>>>>> attribute 'group_add'
>>>>>>>>> File "c:\python35\Lib\asyncio\tasks.py", line 241, in _step
>>>>>>>>> result = coro.throw(exc)
>>>>>>>>> File
>>>>>>>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\channels\consumer.py",
>>>>>>>>>
>>>>>>>>> line 53, in __call__
>>>>>>>>> await await_many_dispatch([receive], self.dispatch)
>>>>>>>>> File
>>>>>>>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\channels\utils.py",
>>>>>>>>>
>>>>>>>>> line 48, in await_many_dispatch
>>>>>>>>> await dispatch(result)
>>>>>>>>> File
>>>>>>>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\asgiref\sync.py",
>>>>>>>>>
>>>>>>>>> line 84, in inner
>>>>>>>>> return await async_func(*args, **kwargs)
>>>>>>>>> File
>>>>>>>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\asgiref\sync.py",
>>>>>>>>>
>>>>>>>>> line 67, in __call__
>>>>>>>>> return await asyncio.wait_for(future, timeout=None)
>>>>>>>>> File "c:\python35\Lib\asyncio\tasks.py", line 367, in wait_for
>>>>>>>>> return (yield from fut)
>>>>>>>>> File "c:\python35\Lib\asyncio\futures.py", line 358, in __iter__
>>>>>>>>> yield self # This tells Task to wait for completion.
>>>>>>>>> File "c:\python35\Lib\asyncio\tasks.py", line 290, in _wakeup
>>>>>>>>> future.result()
>>>>>>>>> File "c:\python35\Lib\asyncio\futures.py", line 274, in result
>>>>>>>>> raise self._exception
>>>>>>>>> File "c:\python35\Lib\concurrent\futures\thread.py", line 55, in
>>>>>>>>> run
>>>>>>>>> result = self.fn(*self.args, **self.kwargs)
>>>>>>>>> File
>>>>>>>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\asgiref\sync.py",
>>>>>>>>>
>>>>>>>>> line 76, in thread_handler
>>>>>>>>> raise e
>>>>>>>>> File
>>>>>>>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\asgiref\sync.py",
>>>>>>>>>
>>>>>>>>> line 74, in thread_handler
>>>>>>>>> self.func(*args, **kwargs)
>>>>>>>>> File
>>>>>>>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\channels\consumer.py",
>>>>>>>>>
>>>>>>>>> line 93, in dispatch
>>>>>>>>> handler(message)
>>>>>>>>> File
>>>>>>>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\channels\generic\websocket.py",
>>>>>>>>>
>>>>>>>>> line 19, in websocket_connect
>>>>>>>>> self.connect()
>>>>>>>>> File
>>>>>>>>> "D:\Programming\DjangoWebsite\HUWebsite\husite\djangoChannels\djangoChannels\consumers.py",
>>>>>>>>>
>>>>>>>>> line 8, in connect
>>>>>>>>> AsyncToSync(self.channel_layer.group_add)("chat",
>>>>>>>>> self.channel_name)
>>>>>>>>> 'NoneType' object has no attribute 'group_add'
>>>>>>>>> [2018/02/03 03:14:32] WebSocket DISCONNECT /sessions/ [
>>>>>>>>> 127.0.0.1:8631]
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On Friday, February 2, 2018 at 7:37:36 PM UTC+2, Andrew Godwin
>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>> Hi Ahmed,
>>>>>>>>>
>>>>>>>>> In the new release channel layers are optional - if you don't
>>>>>>>>> configure them they will indeed come through as None. The settings
>>>>>>>>> format
>>>>>>>>> changed slightly too - you can read more here:
>>>>>>>>> http://channels.readthedocs.io/en/latest/topics/channel_layers.html
>>>>>>>>>
>>>>>>>>> Andrew
>>>>>>>>>
>>>>>>>>> On Fri, Feb 2, 2018 at 3:31 AM, Ahmed Magdy <[email protected]>
>>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>> I'm relatively new to channels and was using Channels v1.x.x
>>>>>>>>>> groups easily, but after v2.0.0 update and reading the documentation
>>>>>>>>>>
>>>>>>>>>> # This example uses WebSocket consumer, which is synchronous, and so
>>>>>>>>>> # needs the async channel layer functions to be converted.
>>>>>>>>>> from asgiref.sync import AsyncToSync
>>>>>>>>>>
>>>>>>>>>> class ChatConsumer(WebsocketConsumer):
>>>>>>>>>>
>>>>>>>>>> def connect(self):
>>>>>>>>>> AsyncToSync(self.channel_layer.group_add)("chat",
>>>>>>>>>> self.channel_name)
>>>>>>>>>>
>>>>>>>>>> def disconnect(self):
>>>>>>>>>> AsyncToSync(self.channel_layer.group_discard)("chat",
>>>>>>>>>> self.channel_name)
>>>>>>>>>>
>>>>>>>>>> Enter code here...
>>>>>>>>>>
>>>>>>>>>> channel_layer, channel_name are always NoneType and exception
>>>>>>>>>> occurs.
>>>>>>>>>>
>>>>>>>>>> Is that because I didn't configure channel layers? But in the old
>>>>>>>>>> version I also used the in memory type and Groups were working well.
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> You received this message because you are subscribed to the
>>>>>>>>>> Google Groups "Django users" group.
>>>>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>>>>> send an email to [email protected].
>>>>>>>>>> To post to this group, send email to [email protected].
>>>>>>>>>> Visit this group at https://groups.google.com/group/django-users.
>>>>>>>>>> To view this discussion on the web visit
>>>>>>>>>> https://groups.google.com/d/msgid/django-users/fff84d59-da69-47d5-a7c3-ee0221680642%40googlegroups.com
>>>>>>>>>>
>>>>>>>>>> <https://groups.google.com/d/msgid/django-users/fff84d59-da69-47d5-a7c3-ee0221680642%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>>>> .
>>>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>> <https://lh3.googleusercontent.com/-fvPoTzCZOwo/WnUNLrDzVZI/AAAAAAAAC6Q/lNyrJjyOUtkudo5F--8pKqzlX23r25i4gCLcBGAs/s1600/Capture.JPG>
>>>>>>>>
>>>>>>>> --
>>>>>>>> You received this message because you are subscribed to the Google
>>>>>>>> Groups "Django users" group.
>>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>>> send an email to [email protected].
>>>>>>>> To post to this group, send email to [email protected].
>>>>>>>> Visit this group at https://groups.google.com/group/django-users.
>>>>>>>> To view this discussion on the web visit
>>>>>>>> https://groups.google.com/d/msgid/django-users/8ca34830-d807-447c-836b-d2e52ee87b6d%40googlegroups.com
>>>>>>>>
>>>>>>>> <https://groups.google.com/d/msgid/django-users/8ca34830-d807-447c-836b-d2e52ee87b6d%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>> .
>>>>>>>>
>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>> You received this message because you are subscribed to the Google
>>>>>> Groups "Django users" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>> send an email to [email protected].
>>>>>> To post to this group, send email to [email protected].
>>>>>> Visit this group at https://groups.google.com/group/django-users.
>>>>>> To view this discussion on the web visit
>>>>>> https://groups.google.com/d/msgid/django-users/d0fc9f6a-43f4-41c1-8a5e-b988a9fa7870%40googlegroups.com
>>>>>>
>>>>>> <https://groups.google.com/d/msgid/django-users/d0fc9f6a-43f4-41c1-8a5e-b988a9fa7870%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>> .
>>>>>>
>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>
>>>>>
>>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "Django users" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to [email protected].
>>>> To post to this group, send email to [email protected].
>>>> Visit this group at https://groups.google.com/group/django-users.
>>>> To view this discussion on the web visit
>>>> https://groups.google.com/d/msgid/django-users/fb9aa942-8d53-472c-bec0-a1c4a46171d3%40googlegroups.com
>>>>
>>>> <https://groups.google.com/d/msgid/django-users/fb9aa942-8d53-472c-bec0-a1c4a46171d3%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>> --
>> You received this message because you are subscribed to the Google Groups
>> "Django users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected] <javascript:>.
>> To post to this group, send email to [email protected]
>> <javascript:>.
>> Visit this group at https://groups.google.com/group/django-users.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/django-users/3329c3e6-a7db-4879-9b87-1c478ba4f0da%40googlegroups.com
>>
>> <https://groups.google.com/d/msgid/django-users/3329c3e6-a7db-4879-9b87-1c478ba4f0da%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/1790fdec-3855-4f19-bc28-9736b9dad005%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.