Ah, yes, it looks like aioredis requires at least 3.5.2. I will update the channels_redis readme to make this clear.
On Fri, Feb 2, 2018 at 11:44 PM, Ahmed Magdy <[email protected]> wrote: > v3.5.1:37a07cee5969 > > On Saturday, February 3, 2018 at 9:41:38 AM UTC+2, Andrew Godwin wrote: >> >> That looks like a problem with the version of Python you are running - >> what version is it? >> >> Andrew >> >> On Fri, Feb 2, 2018 at 11:36 PM, Ahmed Magdy <[email protected]> wrote: >> >>> Since you closed the issue, I'm posting here. >>> Ok, so I've updated asgiref package to 2.1.1 and now getting different >>> exception. >>> >>> >>> [2018/02/03 09:29:23] WebSocket HANDSHAKING /sessions/ [127.0.0.1:13235] >>>> ERROR:root:Exception inside application: '_WindowsSelectorEventLoop' >>>> object has no attribute 'create_future' >>>> 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 99, in inner >>>> return await async_func(*args, **kwargs) >>>> File >>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\asgiref\sync.py", >>>> line 79, 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 91, in thread_handler >>>> raise e >>>> File >>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\asgiref\sync.py", >>>> line 89, 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\djangoChannel >>>> s\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 45, in __call__ >>>> call_result.result() >>>> File "c:\python35\Lib\concurrent\futures\_base.py", line 405, in >>>> result >>>> return self.__get_result() >>>> File "c:\python35\Lib\concurrent\futures\_base.py", line 357, in >>>> __get_result >>>> raise self._exception >>>> File >>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\asgiref\sync.py", >>>> line 53, in main_wrap >>>> result = await self.awaitable(*args, **kwargs) >>>> File >>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\channels_redis\core.py", >>>> line 280, in group_add >>>> pool = await self.connection(self.consistent_hash(group)) >>>> File >>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\channels_redis\core.py", >>>> line 377, in connection >>>> self.pools[index] = await aioredis.create_redis_pool(**s >>>> elf.hosts[index]) >>>> File >>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\aioredis\commands\__init__.py", >>>> line 197, in create_redis_pool >>>> loop=loop) >>>> File >>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\aioredis\pool.py", >>>> line 56, in create_pool >>>> await pool._fill_free(override_min=False) >>>> File >>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\aioredis\pool.py", >>>> line 388, in _fill_free >>>> conn = await self._create_new_connection(address) >>>> File >>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\aioredis\connection.py", >>>> line 124, in create_connection >>>> loop=loop) >>>> File >>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\aioredis\connection.py", >>>> line 163, in __init__ >>>> self._close_waiter = loop.create_future() >>>> '_WindowsSelectorEventLoop' object has no attribute 'create_future' >>>> [2018/02/03 09:29:24] WebSocket DISCONNECT /sessions/ [127.0.0.1:13235] >>>> [2018/02/03 09:30:24] HTTP GET /sessions/ 503 [60.64, 127.0.0.1:13235] >>>> ERROR:asyncio:Task exception was never retrieved >>>> future: <Task finished coro=<receive() done, defined at >>>> D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\channels_redis\core.py:137> >>>> exception=AttributeError("'_WindowsSelectorEventLoop' >>>> object has no attribute 'create_future'",)> >>>> Traceback (most recent call last): >>>> File "c:\python35\Lib\asyncio\tasks.py", line 239, in _step >>>> result = coro.send(None) >>>> File >>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\channels_redis\core.py", >>>> line 158, in receive >>>> return await self.receive_buffer_lpop(channel) >>>> File >>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\channels_redis\core.py", >>>> line 220, in receive_buffer_lpop >>>> task.result() >>>> File "c:\python35\Lib\asyncio\futures.py", line 274, in result >>>> raise self._exception >>>> File "c:\python35\Lib\asyncio\tasks.py", line 239, in _step >>>> result = coro.send(None) >>>> File >>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\channels_redis\core.py", >>>> line 171, in receive_loop >>>> real_channel, message = await self.receive_single(channel) >>>> File >>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\channels_redis\core.py", >>>> line 187, in receive_single >>>> pool = await self.connection(index) >>>> File >>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\channels_redis\core.py", >>>> line 377, in connection >>>> self.pools[index] = await aioredis.create_redis_pool(**s >>>> elf.hosts[index]) >>>> File >>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\aioredis\commands\__init__.py", >>>> line 197, in create_redis_pool >>>> loop=loop) >>>> File >>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\aioredis\pool.py", >>>> line 56, in create_pool >>>> await pool._fill_free(override_min=False) >>>> File >>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\aioredis\pool.py", >>>> line 388, in _fill_free >>>> conn = await self._create_new_connection(address) >>>> File >>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\aioredis\connection.py", >>>> line 124, in create_connection >>>> loop=loop) >>>> File >>>> "D:\Programming\DjangoWebsite\HUWebsite\lib\site-packages\aioredis\connection.py", >>>> line 163, in __init__ >>>> self._close_waiter = loop.create_future() >>>> AttributeError: '_WindowsSelectorEventLoop' object has no attribute >>>> 'create_future' >>>> >>>> >>> On Saturday, February 3, 2018 at 8:47:01 AM UTC+2, Andrew Godwin wrote: >>>> >>>> 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\djangoChannel >>>>>> s\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/grou >>>>>>>>>>>>>>> p/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/grou >>>>>>>>>>>>> p/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/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 >>>>> <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/ms >>> gid/django-users/02948f71-38ed-4f6b-a9f3-ed0ae15d856b%40googlegroups.com >>> <https://groups.google.com/d/msgid/django-users/02948f71-38ed-4f6b-a9f3-ed0ae15d856b%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/af4d70d5-4818-4265-b8a9-f3bf09f00c2b%40googlegroups.com > <https://groups.google.com/d/msgid/django-users/af4d70d5-4818-4265-b8a9-f3bf09f00c2b%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/CAFwN1urkd6Wo0330rzS4D4xfB-woNWk2vLxOzydHy2AS%2BKjQUg%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.

