4.2.0 Release Notes

Channels 4.2 introduces a couple of major but backwards-compatible changes, including most notably enhanced async suppport and fixing a long-standing bug where tests would try and close db connections and erroneously fail.

Additionally, support has been added for Django 5.1.

Enhanced Async Support

Support for asynchronous consumers has been greatly improved. The documentation has been updated to reflect the async ORM features added in Django 4.2. A new channels.db.aclose_old_connections function has been added to easily close old database connections in async consumers.

Warning: Channels now automatically closes connections in async consumers before a new connection, after recieving message (but before dispatching to consumer code), and after disconnecting.

This change has been made to more closely align with Django’s request/response cycle, and to help users avoid attempting to use stale/broken connections.

Notably, Channels does NOT close connections before or after a consumer sends data. This is to avoid database churn and more closely align with user expectations. Instead, users are expected to call aclose_old_connections occasionally during long-lived async connections.

Additionally, channels will automatically use the new async interface for sessions if Django 5.1 or greater is installed. This new interface can be slightly faster in certain cases as it does not always need to context-switch into synchronous execution. This does require a backwards-incompatible change to channels.sessions.InstanceSessionWrapper: the save_session function is now async. If InstanceSessionWrapper was being subclassed in some way (note that this class is an implementation detail and not documented) and save_session was being called or overridden, it will need to be updated to be called with await or defined as async, respectively.

Bugfixes & Small Changes

  • InMemoryChannelLayer has been greatly improved: it now honors expiry times and per-channel capacities, has parallel sending and a safer internal implementation. Note: queue capacities can no longer be changed after a channel has been created.

    Thanks to @devkral (Alexander)

  • Database connections are no longer closed inside tests, which prevents erroneous “Cannot operate on a closed database” errors when running tets.

    Thanks to Jon Janzen.

  • An old import override and an unused deprecation message were removed

    Thanks to @sevdog (Devid) and Jon Janzen.

  • WebsocketCommunicator now has informative assert error messages

    Thanks to Karel Hovorka.

  • WebsocketConsumer now checks that “text” is not None before attempting to use it. This improves support for Hypercorn.

    Thanks to Joaquín Ossandon.

  • BaseChannelLayer now has prototypes on all its methods to improve the hit-rate for smart autocompleters when users need to author their own channel layer and need to implement all required methods.

    Thanks to Jophy Ye.