Cross-Compatibility =================== Channels is being released as both a third-party app for Django 1.8 through 1.10, and being integrated into Django in future. Both of these implementations will be very similar, and code for one will work on the other with minimal changes. The only difference between the two is the import paths. Mostly, where you imported from ``channels`` for the third-party app, you instead import from ``django.channels`` for the built-in solution. For example:: from channels import Channel from channels.auth import channel_session_user Becomes:: from django.channels import Channel from django.channels.auth import channel_session_user There are a few exceptions to this rule, where classes will be moved to other parts of Django in that make more sense: * ``channels.tests.ChannelTestCase`` is found under ``django.test.channels.ChannelTestCase`` * ``channels.handler`` is moved to ``django.core.handlers.asgi`` * ``channels.staticfiles`` is moved to ``django.contrib.staticfiles.consumers`` * The ``runserver`` and ``runworker`` commands are in ``django.core.management.commands`` Writing third-party apps against Channels ----------------------------------------- If you're writing a third-party app that is designed to work with both the ``channels`` third-party app as well as ``django.channels``, we suggest you use a try-except pattern for imports, like this:: try: from django.channels import Channel except ImportError: from channels import Channel All the objects in both versions act the same way, they simply are located on different import paths. There should be no need to change logic.