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.

Reply via email to