Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Django and this thing called Channels
Search
Andrew Godwin
March 09, 2016
Programming
1
780
Django and this thing called Channels
A talk I gave at Python SF Meetup, March 2016.
Andrew Godwin
March 09, 2016
Tweet
Share
More Decks by Andrew Godwin
See All by Andrew Godwin
Reconciling Everything
andrewgodwin
1
380
Django Through The Years
andrewgodwin
0
290
Writing Maintainable Software At Scale
andrewgodwin
0
500
A Newcomer's Guide To Airflow's Architecture
andrewgodwin
0
400
Async, Python, and the Future
andrewgodwin
2
720
How To Break Django: With Async
andrewgodwin
1
790
Taking Django's ORM Async
andrewgodwin
0
780
The Long Road To Asynchrony
andrewgodwin
0
750
The Scientist & The Engineer
andrewgodwin
1
820
Other Decks in Programming
See All in Programming
メッセージングを利用して時間的結合を分離しよう #phperkaigi
kajitack
3
300
new(1.26) ← これすき / kamakura.go #8
utgwkk
0
2.6k
Codex の「自走力」を高める
yorifuji
0
1.3k
Agentic AI: Evolution oder Revolution
mobilelarson
PRO
0
190
守る「だけ」の優しいEMを抜けて、 事業とチームを両方見る視点を身につけた話
maroon8021
3
1.3k
コードレビューをしない選択 #でぃーぷらすトウキョウ
kajitack
3
1.1k
野球解説AI Agentを開発してみた - 2026/02/27 LayerX社内LT会資料
shinyorke
PRO
0
360
Vuetify 3 → 4 何が変わった?差分と移行ポイント10分まとめ
koukimiura
0
180
我々はなぜ「層」を分けるのか〜「関心の分離」と「抽象化」で手に入れる変更に強いシンプルな設計〜 #phperkaigi / PHPerKaigi 2026
shogogg
2
230
SourceGeneratorのマーカー属性問題について
htkym
0
210
CSC307 Lecture 15
javiergs
PRO
0
260
コーディングルールの鮮度を保ちたい / keep-fresh-go-internal-conventions
handlename
0
230
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
135
9.8k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Music & Morning Musume
bryan
47
7.1k
Automating Front-end Workflow
addyosmani
1370
200k
Exploring anti-patterns in Rails
aemeredith
2
290
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.1k
Producing Creativity
orderedlist
PRO
348
40k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.8k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
410
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
1
1.4k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2k
Transcript
Andrew Godwin @andrewgodwin DJANGO and this thing called CHANNELS
Andrew Godwin Hi, I'm Django core developer Senior Software Engineer
at Likes complaining about networking
The Problem First: The Solution Then: The Future Finally:
The Problem WSGI ain't so bad
Browser HTTP Webserver Django WSGI View Handler
Browser WebSocket Webserver Django ???? ??? ????
Very hard to deadlock/cause errors Seems "Django-ish" DESIGN GOALS Scales
decently All works inside runserver
Browser WebSocket Webserver Django Channels Consumers Routing
Browser HTTP Webserver Django Channels Consumer Ch. Routing View URL
dispatch
The Solution A Series Of Channels
An ordered, first-in-first-out, at-most once queue with expiry and delivery
to only one listening consumer. Identified by a unique unicode name. WHAT IS A CHANNEL?
Producers Consumers Channel
There are standard channel names: STANDARDS Clients have unique response
channels: http.request websocket.connect websocket.receive !http.response.jaS4kSDj !websocket.send.Qwek120d
There are standard message formats: STANDARDS - HTTP request -
WebSocket close - HTTP response chunk But you can make your own channel names and formats too.
But how do we do this without making Django asynchronous?
Channels are network-transparent, and protocol termination is separate from business
logic process 1 process 2 protocol server worker server channels client socket
Async/cooperative code, but none of yours process 1 process 2
protocol server worker server channels client socket Your logic running synchronously worker server
For runserver, we run them as threads thread 1 thread
2 protocol server worker server channels client socket worker server thread 3 process 1
A view receives a request and sends a single response.
WHAT IS A CONSUMER? A consumer receives a message and sends zero or more messages.
EXAMPLE This echoes messages back: def ws_message(message): text = message.content['text']
reply = "You said: %s" % text message.reply_channel.send({ 'text': reply, })
EXAMPLE This notifies clients of new blog posts: def newpost(message):
for client in client_list: Channel(client).send({ 'text': message.content['id'], })
EXAMPLE But Channels has a better solution for that: #
Channel "websocket.connect" def connect(message): Group('liveblog').add( message.reply_channel) # Channel "new-liveblog" def newpost(message): Group('liveblog').send({ 'text': message.content['id'], })
EXAMPLE And you can send to channels from anywhere: class
LiveblogPost(models.Model): ... def save(self): ... Channel('new-liveblog').send({ 'id': str(self.id), })
EXAMPLE You can offload processing from views: def upload_image(request): ...
Channel('thumbnail').send({ 'id': str(image.id), }) return render(...)
EXAMPLE All the routing is set up like URLs: from
.consumers import ws_connect routing = { 'websocket.connect': ws_connect, 'websocket.receive': 'a.b.receive', 'thumbnail': 'images.consumers.thumb', }
EXAMPLE The HTTP channel just goes to the view system
by default. routing = { # This is actually the default 'http.request': 'channels.asgi.ViewConsumer', }
The Future What does it all mean?
WSGI
WSGI 2?
ASGI channels.readthedocs.org/en/latest/asgi.html
channel_layer.send(channel, message) channel_layer.receive_many(channels) + message standards + extensions (groups, stats)
Daphne HTTP/WebSocket ASGI server asgiref Memory layer, conformance suite, WSGI
adapters asgi_redis Redis-based channel layer
Raw ASGI app example: while True: channel, message = layer.receive_many(
["http.request"], block = True, ) if channel is None: continue layer.send( message['reply_channel'], { 'content': 'Hello World!', 'status': 200, } )
Django 1.10
Django 1.10 And 1.8, 1.9 as a third-party app
It's all optional. No need to change anything if you
don't want to use channels.
pip install channels channels.readthedocs.org
Thanks. Andrew Godwin @andrewgodwin