Yup, that looks like a genuine bug, I have opened a GitHub issue to track it: https://github.com/django/channels/issues/848
Andrew On Fri, Feb 2, 2018 at 10:35 PM, Ahmed Magdy <ahmedmgd...@gmail.com> wrote: > 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 <ahmed...@gmail.com> 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 <ahmed...@gmail.com> 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 <ahmed...@gmail.com> >>>>>> 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 <ahmed...@gmail.com> >>>>>>>> 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 <ahmed...@gmail.com> >>>>>>>>>> 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 django-users...@googlegroups.com. >>>>>>>>>>> To post to this group, send email to django...@googlegroups.com. >>>>>>>>>>> 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 django-users...@googlegroups.com. >>>>>>>>> To post to this group, send email to django...@googlegroups.com. >>>>>>>>> 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 django-users...@googlegroups.com. >>>>>>> To post to this group, send email to django...@googlegroups.com. >>>>>>> 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 django-users...@googlegroups.com. >>>>> To post to this group, send email to django...@googlegroups.com. >>>>> 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 django-users...@googlegroups.com. >>> To post to this group, send email to django...@googlegroups.com. >>> Visit this group at https://groups.google.com/group/django-users. >>> To view this discussion on the web visit https://groups.google.com/d/ms >>> gid/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 django-users+unsubscr...@googlegroups.com. > To post to this group, send email to django-users@googlegroups.com. > 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 > <https://groups.google.com/d/msgid/django-users/1790fdec-3855-4f19-bc28-9736b9dad005%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 django-users+unsubscr...@googlegroups.com. To post to this group, send email to django-users@googlegroups.com. 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/CAFwN1uo3M3RbzVHrLGhqyarCvfPdRmx9YSTtGDq6X%3Dzx-je%2Bzg%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.