SlideShare a Scribd company logo
The State of WebSockets in Django
Rami Sayar - @ramisayar
Technical Evangelist
Microsoft Canada
Agenda
•  Where is WebSockets right now?
•  Where is Socket.IO?
•  Where does Django fit in?
•  Using Django SwampDragon.
•  Using Gevent.
CONFOO - @RAMISAYAR
Assumptions
•  Working knowledge of Django, JavaScript & Python.
Note: Slides will be made available.
CONFOO - @RAMISAYAR
What is a production web app?
•  Django is surrounded by tons
of applications, services and
code in production.
•  Advanced Django architecture
is needed to support Django
in production without failing
hard.
•  WebSockets falls apart from
the rest.
CONFOO - @RAMISAYAR
WebSockets
•  “WebSocket is a protocol for
full-duplex communication
channels over a single TCP
connection.” Wikipedia
•  Image Reference
CONFOO - @RAMISAYAR
WebSockets
CONFOO - @RAMISAYAR
Socket.IO
•  “Socket.IO enables real-time
bidirectional event-based
communication. It works on
every platform, browser or
device, focusing equally on
reliability and speed.”
Reference
•  Use by everyone: Microsoft
Office, Yammer, Zendesk,
Trello, etc…
CONFOO - @RAMISAYAR
Socket.IO Version 1.0 is here!
Technically, now at v1.3.4
CONFOO - @RAMISAYAR
Python, Django & WebSockets.
CONFOO - @RAMISAYAR
Python and WebSockets
•  Python and WebSockets has notoriously been very difficult.
•  Two reasons:
•  WSGI protocol does not support WebSockets. Most popular form of
web request handling in the Python web apps. Most frameworks are
designed for use with FastCGI or mod_wsgi, etc.
•  Default Python networked apps not exactly designed for event-based
communication, you have to use things like gevent and twisted/tornado.
CONFOO - @RAMISAYAR
Django & WebSockets
•  Django applications complete HttpResponses.
•  Django not well suited for WebSocket event handling structure
nor the channel approach in Socket.IO.
CONFOO - @RAMISAYAR
Presenting 3 Methods for WebSockets in Django
CONFOO - @RAMISAYAR
gevent
•  “gevent is a coroutine-based Python networking library that
uses greenlets to provide a synchronous API on top of the libev
event loop.”
•  Event loop based on libev (same as Node.js)
•  Lightweight execution units, a.k.a. “lightweight threads”.
•  Cooperative sockets with SSL support.
•  Similar programming model to Node.js.
CONFOO - @RAMISAYAR
gevent-socketio
•  gevent-socketio is a pure Python implementation of the
Socket.IO protocol. Basically, it is a port of Socket.IO and
typically behind in major releases.
•  Designed to work with multiple different WSGI-based web
frameworks.
•  Handles the “WSGI” problem by providing a custom gevent
WSGI server for use with gevent-socketio.
•  Only dependencies are gevent.
•  Imperfect solution: Django is still blocking (monkey
patching is not perfect).
CONFOO - @RAMISAYAR
Demo 1: Django chat engine with gevent-socketio
https://github.com/abourget/gevent-socketio/tree/master/examples/
django_chat
CONFOO - @RAMISAYAR
“Native” Django Implementation
•  Previous approach requires significant modifications to your
current Django app serving stack. Native as in you don’t need to
know anything besides Django.
•  Building an implementation of WebSockets on top of Django.
•  Identified two problems for WebSockets in Django:
•  Problems with WSGI still present EXCEPT in uWSGI.
•  Networked event handling model is problematic.
•  Solution:
•  Use Nginx which follows – event-driven async architecture.
•  uWSGI & Gevent for event handling.
CONFOO - @RAMISAYAR
Django-WebSocket-Redis
•  Module implements websockets on top of Django.
•  Use Redis as a data store for messaging behind uWSGI and Nginx.
•  Runs a separate Django main loop in a cooperative concurrency
model using gevent -> 1 thread for all open websockets.
•  Django can be started as usual with ‘./manage.py runserver’.
•  Normal requests communication with separate main (websocket)
loop through Redis.
•  Read:
Offloading Websockets and Server-Sent Events AKA “Combine
them with Django safely”
CONFOO - @RAMISAYAR
Demo 2: Django-WebSockets-Redis
https://github.com/jrief/django-websocket-redis
CONFOO - @RAMISAYAR
SwampDragon
•  New project that adds websocket support
•  Self-publishing models
•  Django ORM Style Data Filter for Subscription Channels –
Similar to WebSockets + Data Filter
•  Relies on Redis for messaging + Tornado
•  Angular JS Support
CONFOO - @RAMISAYAR
Demo 3: Django Swampdragon
https://github.com/jonashagstedt/swampdragon
CONFOO - @RAMISAYAR
On Redis
•  Redis is extremely popular as an easy and simple publish-
subscribe.
•  Redis is very particular about memory. Running out of memory
in Redis -> CRASH AND BURN!
•  If you don’t have enough memory in your VM to run Redis
Cache -> Change your approach, use Apache Kafka.
CONFOO - @RAMISAYAR
What did we learn?
•  The State of WebSockets in Django.
•  Django and WebSockets is not impossible.
CONFOO - @RAMISAYAR
Thank You! Questions?
Follow @ramisayar
CONFOO - @RAMISAYAR
Resources
•  http://swampdragon.net/
•  http://django-websocket-redis.readthedocs.org/en/latest/
•  https://github.com/jrief/django-websocket-redis
•  https://github.com/abourget/gevent-socketio/tree/master/
examples/django_chat
•  http://jpadilla.com/post/74391616727/the-easiest-way-to-add-
websockets-to-django
•  http://ferretfarmer.net/2013/09/05/tutorial-real-time-chat-with-
django-twisted-and-websockets-part-1/
CONFOO - @RAMISAYAR
©2013	
  Microso-	
  Corpora1on.	
  All	
  rights	
  reserved.	
  Microso-,	
  Windows,	
  Office,	
  Azure,	
  System	
  Center,	
  Dynamics	
  and	
  other	
  product	
  names	
  are	
  or	
  may	
  be	
  registered	
  trademarks	
  and/or	
  trademarks	
  in	
  the	
  
U.S.	
  and/or	
  other	
  countries.	
  The	
  informa1on	
  herein	
  is	
  for	
  informa1onal	
  purposes	
  only	
  and	
  represents	
  the	
  current	
  view	
  of	
  Microso-	
  Corpora1on	
  as	
  of	
  the	
  date	
  of	
  this	
  presenta1on.	
  Because	
  Microso-	
  
must	
  respond	
  to	
  changing	
  market	
  condi1ons,	
  it	
  should	
  not	
  be	
  interpreted	
  to	
  be	
  a	
  commitment	
  on	
  the	
  part	
  of	
  Microso-,	
  and	
  Microso-	
  cannot	
  guarantee	
  the	
  accuracy	
  of	
  any	
  informa1on	
  provided	
  a-er	
  
the	
  date	
  of	
  this	
  presenta1on.	
  MICROSOFT	
  MAKES	
  NO	
  WARRANTIES,	
  EXPRESS,	
  IMPLIED	
  OR	
  STATUTORY,	
  AS	
  TO	
  THE	
  INFORMATION	
  IN	
  THIS	
  PRESENTATION.	
  

More Related Content

PDF
SwampDragon presentation: The Copenhagen Django Meetup Group
PDF
Implementing real time web applications with Django
PDF
Alexei Vladishev - Opening Speech
PPSX
Oded Coster - Stack Overflow behind the scenes - how it's made - Codemotion M...
PDF
Vladimir Ulogov - Beyond the Loadable Module
PDF
Appsec DC - wXf -2010
PDF
Virtual Security Lab Setup - OWASP Broken Web Apps, Webgoat, & ZAP
PDF
LasCon 2014 DevOoops
SwampDragon presentation: The Copenhagen Django Meetup Group
Implementing real time web applications with Django
Alexei Vladishev - Opening Speech
Oded Coster - Stack Overflow behind the scenes - how it's made - Codemotion M...
Vladimir Ulogov - Beyond the Loadable Module
Appsec DC - wXf -2010
Virtual Security Lab Setup - OWASP Broken Web Apps, Webgoat, & ZAP
LasCon 2014 DevOoops

What's hot (20)

PDF
Webinar - Matteo Manchi: Dal web al nativo: Introduzione a React Native
PDF
Mini-Training: Redis
PDF
Mobile Library Development - stuck between a pod and a jar file - Zan Markan ...
PDF
Monitoring Big Data Systems Done "The Simple Way" - Codemotion Milan 2017 - D...
PPTX
Масштабируя TLS / Артём Гавриченков (Qrator Labs)
KEY
Web frameworks don't matter
PDF
Cloudstack China User Group Report
PPTX
Full stack development with node and NoSQL - All Things Open - October 2017
KEY
Dcjq node.js presentation
PPTX
DevOops Redux Ken Johnson Chris Gates - AppSec USA 2016
PPTX
Gabriele Provinciali/Gabriele Folchi/Luca Postacchini - Sviluppo con piattafo...
ODP
JavaOne 2014 Security Testing for Developers using OWASP ZAP
ODP
OWASP 2014 AppSec EU ZAP Advanced Features
ODP
OWASP 2013 APPSEC USA Talk - OWASP ZAP
ODP
RSYSLOG v8 improvements and how to write plugins in any language.
PDF
Dimitri Bellini and Pietro Antonacci - Manage Zabbix Proxies in Remote Networ...
ODP
OWASP 2013 AppSec EU Hamburg - ZAP Innovations
PDF
Dev objective2015 lets git together
ODP
Automating OWASP ZAP - DevCSecCon talk
ODP
OWASP 2012 AppSec Dublin ZAP Intro
Webinar - Matteo Manchi: Dal web al nativo: Introduzione a React Native
Mini-Training: Redis
Mobile Library Development - stuck between a pod and a jar file - Zan Markan ...
Monitoring Big Data Systems Done "The Simple Way" - Codemotion Milan 2017 - D...
Масштабируя TLS / Артём Гавриченков (Qrator Labs)
Web frameworks don't matter
Cloudstack China User Group Report
Full stack development with node and NoSQL - All Things Open - October 2017
Dcjq node.js presentation
DevOops Redux Ken Johnson Chris Gates - AppSec USA 2016
Gabriele Provinciali/Gabriele Folchi/Luca Postacchini - Sviluppo con piattafo...
JavaOne 2014 Security Testing for Developers using OWASP ZAP
OWASP 2014 AppSec EU ZAP Advanced Features
OWASP 2013 APPSEC USA Talk - OWASP ZAP
RSYSLOG v8 improvements and how to write plugins in any language.
Dimitri Bellini and Pietro Antonacci - Manage Zabbix Proxies in Remote Networ...
OWASP 2013 AppSec EU Hamburg - ZAP Innovations
Dev objective2015 lets git together
Automating OWASP ZAP - DevCSecCon talk
OWASP 2012 AppSec Dublin ZAP Intro
Ad

Viewers also liked (20)

PDF
JVM Garbage Collection Tuning
PPTX
Websockets: Pushing the web forward
PDF
Reducing load with RabbitMQ
PDF
What You Should Know About WebLogic Server 12c (12.2.1.2) #oow2015 #otntour2...
PDF
Maximize information exchange in your enterprise with AMQP
PDF
HTTP Status Codes Cheat Sheet: An Exhaustive List
PPTX
HTTP/2 Changes Everything
PPTX
HTML5 WebSockets in Python/Django
PDF
Real-time Web Application with Socket.IO, Node.js, and Redis
PDF
What's New in ES6 for Web Devs
PDF
Real time web_apps_pycon2012-v1
PPTX
PyConMY 2016 Django Channels
PDF
Introduction to React Native
PDF
FITC - Bootstrap Unleashed
PDF
Redis : Database, cache, pub/sub and more at Jelly button games
PDF
Hacking websockets
PDF
laravel websocket(use redis pubsub) [Laravel meetup tokyo]
PPTX
Implementation of RSA Algorithm for Speech Data Encryption and Decryption
PDF
Django Introduction & Tutorial
KEY
Django Celery
JVM Garbage Collection Tuning
Websockets: Pushing the web forward
Reducing load with RabbitMQ
What You Should Know About WebLogic Server 12c (12.2.1.2) #oow2015 #otntour2...
Maximize information exchange in your enterprise with AMQP
HTTP Status Codes Cheat Sheet: An Exhaustive List
HTTP/2 Changes Everything
HTML5 WebSockets in Python/Django
Real-time Web Application with Socket.IO, Node.js, and Redis
What's New in ES6 for Web Devs
Real time web_apps_pycon2012-v1
PyConMY 2016 Django Channels
Introduction to React Native
FITC - Bootstrap Unleashed
Redis : Database, cache, pub/sub and more at Jelly button games
Hacking websockets
laravel websocket(use redis pubsub) [Laravel meetup tokyo]
Implementation of RSA Algorithm for Speech Data Encryption and Decryption
Django Introduction & Tutorial
Django Celery
Ad

Similar to The State of WebSockets in Django (20)

PDF
Scalable Django Architecture
KEY
Realtime rocks
PPTX
Realtime web2012
PPTX
Webdevcon Keynote hh-2012-09-18
PDF
Python Web Framework – A Detailed List of Web Frameworks in Python
PDF
WebSocket Perspectives 2015 - Clouds, Streams, Microservices and WoT
PDF
End-to-end HTML5 APIs - The Geek Gathering 2013
PDF
Laug Mootools And Common Js
PDF
Web Frameworks of the Future
PDF
An introduction to Node.js
KEY
Google App Engine Java, Groovy and Gaelyk
PDF
Not Only Streams for Akademia JLabs
PDF
Stackato v3
KEY
HTML5 is the Future of Mobile, PhoneGap Takes You There Today
PPTX
NodeJS and what is actually does
PPTX
Splunking the JVM
PDF
Janus Workshop @ ClueCon 2020
PPTX
Advanced Web Technology using Django.pptx
Scalable Django Architecture
Realtime rocks
Realtime web2012
Webdevcon Keynote hh-2012-09-18
Python Web Framework – A Detailed List of Web Frameworks in Python
WebSocket Perspectives 2015 - Clouds, Streams, Microservices and WoT
End-to-end HTML5 APIs - The Geek Gathering 2013
Laug Mootools And Common Js
Web Frameworks of the Future
An introduction to Node.js
Google App Engine Java, Groovy and Gaelyk
Not Only Streams for Akademia JLabs
Stackato v3
HTML5 is the Future of Mobile, PhoneGap Takes You There Today
NodeJS and what is actually does
Splunking the JVM
Janus Workshop @ ClueCon 2020
Advanced Web Technology using Django.pptx

More from Rami Sayar (8)

PDF
FITC - Exploring Art-Directed Responsive Images
PDF
Web a Quebec - JS Debugging
PDF
An Intense Overview of the React Ecosystem
PDF
Creating Beautiful CSS3 Animations - FITC Amsterdam 2016
PDF
Here Be Dragons - Debugging WordPress
PDF
FITC - Here Be Dragons: Advanced JavaScript Debugging
PDF
FITC - Node.js 101
PDF
FITC - Data Visualization in Practice
FITC - Exploring Art-Directed Responsive Images
Web a Quebec - JS Debugging
An Intense Overview of the React Ecosystem
Creating Beautiful CSS3 Animations - FITC Amsterdam 2016
Here Be Dragons - Debugging WordPress
FITC - Here Be Dragons: Advanced JavaScript Debugging
FITC - Node.js 101
FITC - Data Visualization in Practice

Recently uploaded (20)

PPTX
INTERNET------BASICS-------UPDATED PPT PRESENTATION
PPTX
Job_Card_System_Styled_lorem_ipsum_.pptx
PPTX
Introuction about WHO-FIC in ICD-10.pptx
PPTX
June-4-Sermon-Powerpoint.pptx USE THIS FOR YOUR MOTIVATION
PDF
An introduction to the IFRS (ISSB) Stndards.pdf
PPTX
PptxGenJS_Demo_Chart_20250317130215833.pptx
PPTX
Introuction about ICD -10 and ICD-11 PPT.pptx
PDF
LABUAN4D EXCLUSIVE SERVER STAR GAMING ASIA NO.1
PDF
RPKI Status Update, presented by Makito Lay at IDNOG 10
PPTX
international classification of diseases ICD-10 review PPT.pptx
PDF
Best Practices for Testing and Debugging Shopify Third-Party API Integrations...
PDF
LABUAN4D EXCLUSIVE SERVER STAR GAMING ASIA NO.1
PPTX
Funds Management Learning Material for Beg
PDF
Testing WebRTC applications at scale.pdf
PPTX
Slides PPTX World Game (s) Eco Economic Epochs.pptx
PPTX
522797556-Unit-2-Temperature-measurement-1-1.pptx
PPTX
Module 1 - Cyber Law and Ethics 101.pptx
PPTX
Introduction about ICD -10 and ICD11 on 5.8.25.pptx
PDF
Automated vs Manual WooCommerce to Shopify Migration_ Pros & Cons.pdf
PPTX
Introduction to Information and Communication Technology
INTERNET------BASICS-------UPDATED PPT PRESENTATION
Job_Card_System_Styled_lorem_ipsum_.pptx
Introuction about WHO-FIC in ICD-10.pptx
June-4-Sermon-Powerpoint.pptx USE THIS FOR YOUR MOTIVATION
An introduction to the IFRS (ISSB) Stndards.pdf
PptxGenJS_Demo_Chart_20250317130215833.pptx
Introuction about ICD -10 and ICD-11 PPT.pptx
LABUAN4D EXCLUSIVE SERVER STAR GAMING ASIA NO.1
RPKI Status Update, presented by Makito Lay at IDNOG 10
international classification of diseases ICD-10 review PPT.pptx
Best Practices for Testing and Debugging Shopify Third-Party API Integrations...
LABUAN4D EXCLUSIVE SERVER STAR GAMING ASIA NO.1
Funds Management Learning Material for Beg
Testing WebRTC applications at scale.pdf
Slides PPTX World Game (s) Eco Economic Epochs.pptx
522797556-Unit-2-Temperature-measurement-1-1.pptx
Module 1 - Cyber Law and Ethics 101.pptx
Introduction about ICD -10 and ICD11 on 5.8.25.pptx
Automated vs Manual WooCommerce to Shopify Migration_ Pros & Cons.pdf
Introduction to Information and Communication Technology

The State of WebSockets in Django

  • 1. The State of WebSockets in Django Rami Sayar - @ramisayar Technical Evangelist Microsoft Canada
  • 2. Agenda •  Where is WebSockets right now? •  Where is Socket.IO? •  Where does Django fit in? •  Using Django SwampDragon. •  Using Gevent. CONFOO - @RAMISAYAR
  • 3. Assumptions •  Working knowledge of Django, JavaScript & Python. Note: Slides will be made available. CONFOO - @RAMISAYAR
  • 4. What is a production web app? •  Django is surrounded by tons of applications, services and code in production. •  Advanced Django architecture is needed to support Django in production without failing hard. •  WebSockets falls apart from the rest. CONFOO - @RAMISAYAR
  • 5. WebSockets •  “WebSocket is a protocol for full-duplex communication channels over a single TCP connection.” Wikipedia •  Image Reference CONFOO - @RAMISAYAR
  • 7. Socket.IO •  “Socket.IO enables real-time bidirectional event-based communication. It works on every platform, browser or device, focusing equally on reliability and speed.” Reference •  Use by everyone: Microsoft Office, Yammer, Zendesk, Trello, etc… CONFOO - @RAMISAYAR
  • 8. Socket.IO Version 1.0 is here! Technically, now at v1.3.4 CONFOO - @RAMISAYAR
  • 9. Python, Django & WebSockets. CONFOO - @RAMISAYAR
  • 10. Python and WebSockets •  Python and WebSockets has notoriously been very difficult. •  Two reasons: •  WSGI protocol does not support WebSockets. Most popular form of web request handling in the Python web apps. Most frameworks are designed for use with FastCGI or mod_wsgi, etc. •  Default Python networked apps not exactly designed for event-based communication, you have to use things like gevent and twisted/tornado. CONFOO - @RAMISAYAR
  • 11. Django & WebSockets •  Django applications complete HttpResponses. •  Django not well suited for WebSocket event handling structure nor the channel approach in Socket.IO. CONFOO - @RAMISAYAR
  • 12. Presenting 3 Methods for WebSockets in Django CONFOO - @RAMISAYAR
  • 13. gevent •  “gevent is a coroutine-based Python networking library that uses greenlets to provide a synchronous API on top of the libev event loop.” •  Event loop based on libev (same as Node.js) •  Lightweight execution units, a.k.a. “lightweight threads”. •  Cooperative sockets with SSL support. •  Similar programming model to Node.js. CONFOO - @RAMISAYAR
  • 14. gevent-socketio •  gevent-socketio is a pure Python implementation of the Socket.IO protocol. Basically, it is a port of Socket.IO and typically behind in major releases. •  Designed to work with multiple different WSGI-based web frameworks. •  Handles the “WSGI” problem by providing a custom gevent WSGI server for use with gevent-socketio. •  Only dependencies are gevent. •  Imperfect solution: Django is still blocking (monkey patching is not perfect). CONFOO - @RAMISAYAR
  • 15. Demo 1: Django chat engine with gevent-socketio https://github.com/abourget/gevent-socketio/tree/master/examples/ django_chat CONFOO - @RAMISAYAR
  • 16. “Native” Django Implementation •  Previous approach requires significant modifications to your current Django app serving stack. Native as in you don’t need to know anything besides Django. •  Building an implementation of WebSockets on top of Django. •  Identified two problems for WebSockets in Django: •  Problems with WSGI still present EXCEPT in uWSGI. •  Networked event handling model is problematic. •  Solution: •  Use Nginx which follows – event-driven async architecture. •  uWSGI & Gevent for event handling. CONFOO - @RAMISAYAR
  • 17. Django-WebSocket-Redis •  Module implements websockets on top of Django. •  Use Redis as a data store for messaging behind uWSGI and Nginx. •  Runs a separate Django main loop in a cooperative concurrency model using gevent -> 1 thread for all open websockets. •  Django can be started as usual with ‘./manage.py runserver’. •  Normal requests communication with separate main (websocket) loop through Redis. •  Read: Offloading Websockets and Server-Sent Events AKA “Combine them with Django safely” CONFOO - @RAMISAYAR
  • 19. SwampDragon •  New project that adds websocket support •  Self-publishing models •  Django ORM Style Data Filter for Subscription Channels – Similar to WebSockets + Data Filter •  Relies on Redis for messaging + Tornado •  Angular JS Support CONFOO - @RAMISAYAR
  • 20. Demo 3: Django Swampdragon https://github.com/jonashagstedt/swampdragon CONFOO - @RAMISAYAR
  • 21. On Redis •  Redis is extremely popular as an easy and simple publish- subscribe. •  Redis is very particular about memory. Running out of memory in Redis -> CRASH AND BURN! •  If you don’t have enough memory in your VM to run Redis Cache -> Change your approach, use Apache Kafka. CONFOO - @RAMISAYAR
  • 22. What did we learn? •  The State of WebSockets in Django. •  Django and WebSockets is not impossible. CONFOO - @RAMISAYAR
  • 23. Thank You! Questions? Follow @ramisayar CONFOO - @RAMISAYAR
  • 24. Resources •  http://swampdragon.net/ •  http://django-websocket-redis.readthedocs.org/en/latest/ •  https://github.com/jrief/django-websocket-redis •  https://github.com/abourget/gevent-socketio/tree/master/ examples/django_chat •  http://jpadilla.com/post/74391616727/the-easiest-way-to-add- websockets-to-django •  http://ferretfarmer.net/2013/09/05/tutorial-real-time-chat-with- django-twisted-and-websockets-part-1/ CONFOO - @RAMISAYAR
  • 25. ©2013  Microso-  Corpora1on.  All  rights  reserved.  Microso-,  Windows,  Office,  Azure,  System  Center,  Dynamics  and  other  product  names  are  or  may  be  registered  trademarks  and/or  trademarks  in  the   U.S.  and/or  other  countries.  The  informa1on  herein  is  for  informa1onal  purposes  only  and  represents  the  current  view  of  Microso-  Corpora1on  as  of  the  date  of  this  presenta1on.  Because  Microso-   must  respond  to  changing  market  condi1ons,  it  should  not  be  interpreted  to  be  a  commitment  on  the  part  of  Microso-,  and  Microso-  cannot  guarantee  the  accuracy  of  any  informa1on  provided  a-er   the  date  of  this  presenta1on.  MICROSOFT  MAKES  NO  WARRANTIES,  EXPRESS,  IMPLIED  OR  STATUTORY,  AS  TO  THE  INFORMATION  IN  THIS  PRESENTATION.  

Editor's Notes

  • #5: What does a web application look like in production?