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.

Reply via email to