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 <[email protected]> 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 <[email protected]> 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]. >>> 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/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 [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 > <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 [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/CAFwN1uo3M3RbzVHrLGhqyarCvfPdRmx9YSTtGDq6X%3Dzx-je%2Bzg%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.

