Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[Python Sul 2017, PT-BR] Django Channeled

[Python Sul 2017, PT-BR] Django Channeled

Channels mudam a forma como utilizamos Django: ao invés de somente receber e responder requisições – uma atrás da outra – agora temos acesso a WebSocket, long-poll HTTP e outras maravilhas da assincronia. Orientação a evento FTW.

Nessa talk vamos ver os conceitos requisições assíncronas e como implementá-las com Django Channels!

O D é mudo.

Quiz: https://github.com/jonatasbaldin/wsquiz

67e79c99f3b6e205ebc68a6ab91545ad?s=128

Jonatas Baldin

September 08, 2017
Tweet

Transcript

  1. DJANGO C H A N N E L E D

    @jonatasbaldin
  2. DJANGO É UM FRAMEWORK ANTIGO RESOLVENDO PROBLEMAS ANTIGOS

  3. Em 2015, aplicações web precisavam apenas saber como falar HTTP

  4. cliente faz uma requisição server processa a requisição e envia

    uma resposta cliente apresenta a resposta
  5. cliente faz uma requisição Django recebe uma Requisição HTTP chama

    uma View que retorna uma Resposta HTTP cliente apresenta a resposta
  6. Em 2017, aplicações web precisam saber como mostrar um feed

    na sua timeline, de milhares de pessoas ao redor do mundo, assim que elas publicarem algum conteúdo, em menos de um segundo
  7. Aplicações Web em Tempo Real

  8. SSE WebRTC Streaming WebSockets

  9. WebSockets

  10. WebSocket é uma camada de transporte bidirecional e orientada à

    mensagens, possibilitando clientes e servidores trocarem informações usando uma conexão permanente
  11. WebSocket é uma camada de transporte bidirecional e orientada à

    mensagens, possibilitando clientes e servidores trocarem informações usando uma conexão permanente
  12. WebSocket é uma camada de transporte bidirecional e orientada à

    mensagens, possibilitando clientes e servidores trocarem informações usando uma conexão permanente
  13. WebSocket é uma camada de transporte bidirecional e orientada à

    mensagens, possibilitando clientes e servidores trocarem informações usando uma conexão permanente
  14. WebSocket não é HTTP!

  15. Tem uma API JavaScript simples .onopen() .onmessage() .send() .onerror() .onclose()

  16. cliente se conecta ao WebSocket servidor estabelece uma conexão e

    a informação flui
  17. cliente se conecta ao WebSocket Django não entende e deixa

    o cliente triste :(
  18. DJANGO É UM FRAMEWORK ANTIGO RESOLVENDO PROBLEMAS ANTIGOS

  19. DJANGO É UM FRAMEWORK ANTIGO RESOLVENDO PROBLEMAS ANTIGOS MAS ELE

    PODE SER EXTENDIDO PARA RESOLVER OS NOVOS PROBLEMAS
  20. Channels

  21. Channels é uma biblioteca que possibilita Django a lidar com

    WebSockets e outras tarefas assíncronas usando padrões de design do Django
  22. Com Channels, Django recebe mensagens que são roteadas e armazenadas

    por um backend
  23. Depois disso, as mensagens são processadas por um worker que

    pode retornar zero ou mais mensagens
  24. view WSGI cliente Requisição HTTP Resposta HTTP

  25. Worker Channels Backend cliente mensagem mensagem ASGI

  26. Vamos ver parte por parte

  27. Como WSGI não entende WebSockets, uma nova especificação for criada

    – ASGI – que basicamente substitui o WSGI
  28. Channels possui sua própria implementação ASGI, chamado Daphne

  29. # asgi.py import os from channels.asgi import get_channel_layer os.environ.setdefault( 'DJANGO_SETTINGS_MODULE',

    ‘wsquiz.settings' ) channel_layer = get_channel_layer()
  30. Daphne é executado como qualquer outro servidor WSGI, só rodar

    o comando $ daphne project.asgi:channel_layer
  31. Perceba que ASGI também fala HTTP, então você pode remover

    completamente seu servidor WSGI
  32. Worker Channels Backend ASGI (o novo WSGI - Daphne) cliente

    mensagem mensagem
  33. As mensagens são roteadas e armazenadas em um Channel pelo

    Channels Backend
  34. Um Channel é uma estrutura de dados que basicamente se

    comporta como uma fila de jobs nomeada
  35. A estrutura é ordenada, FIFO onde as mensagens expiram e

    são entregues no máximo uma vez
  36. A estrutura é ordenada, FIFO onde as mensagens expiram e

    são entregues no máximo uma vez
  37. A estrutura é ordenada, FIFO onde as mensagens expiram e

    são entregues no máximo uma vez
  38. A estrutura é ordenada, FIFO onde as mensagens expiram e

    são entregues no máximo uma vez
  39. A estrutura é ordenada, FIFO onde as mensagens expiram e

    são entregues no máximo uma vez
  40. Cada mensagem posse um único reply_channel que é usado para

    enviar mensagens de volta ao usuário
  41. Também podemos atribuir um reply_channel a um Channel Group, possibilitando

    o broadcast de mensagens
  42. # consumers.py def ws_connect(message): message.reply_channel.send({'accept': True}) def ws_message(message): message.reply_channel.send(message[‘text’]) #

    routing.py channel_routing = [ route('websocket.connect', ws_connect), route('websocket.receive', ws_message), ]
  43. # consumers.py def ws_connect(message): Group('tweets').add(message.reply_channel) # models.py class Tweet(models.Model): text

    = models.CharField(max_length=140) def save(self, *args, **kwargs): result = super().save(*args, **kwargs) Group('tweets').send({'text': self.text}) return result # routing.py channel_routing = [ route('websocket.connect', ws_connect), ]
  44. O Channels Backend é usado para armazenar mensagens e pode

    ser configurado de maneiras diferentes
  45. In-Memory testes e processos únicos POSIX IPC única máquina REDIS

    armazenamento em rede
  46. # settings.py CHANNEL_LAYERS = { 'default': { 'BACKEND': 'asgi_redis.RedisChannelLayer', 'CONFIG':

    { 'hosts': [(REDIS_HOST, 6379)], }, 'ROUTING': 'wsquiz.routing.channel_routing', } }
  47. Worker Channels Backend (armazenamento) ASGI (o novo WSGI - Daphne)

    cliente mensagem mensagem
  48. O worker é responsável por escutar os Channels e consumir

    as mensagens assim que estiverem prontas
  49. Ele pode executar qualquer código arbitrário, como enviar uma mensagem

    de volta ao cliente ou executar uma tarefa em segundo plano
  50. # consumers.py def ws_message(message): message.reply_channel.send(message['text']) # routing.py channel_routing = [

    route('websocket.receive', ws_message), ]
  51. Channels vem com um comando Django para rodar workers! $

    python manage.py runworker
  52. Worker (comando Django) Channels Backend (armazenamento) ASGI (o novo WSGI

    - Daphne) cliente mensagem mensagem
  53. Para desenvolver um cliente – uma aplicação JavaScript, por exemplo

    – Channels possuí uma biblioteca chamada WebSocketBridge
  54. const webSocketBridge = new channels.WebSocketBridge(); webSocketBridge.connect('/ws/'); webSocketBridge.listen(function(data) { console.log(data); });

  55. cliente (WebSocketBridge) Worker (comando Django) Channels Backend (armazenamento) ASGI (o

    novo WSGI - Daphne) mensagem mensagem
  56. Resumindo…

  57. Worker Channels Backend cliente mensagem mensagem ASGI

  58. Worker Channels Backend ASGI (o novo WSGI - Daphne) cliente

    mensagem mensagem
  59. Worker Channels Backend (armazenamento) ASGI (o novo WSGI - Daphne)

    cliente mensagem mensagem
  60. Worker (comando Django) Channels Backend (armazenamento) ASGI (o novo WSGI

    - Daphne) cliente mensagem mensagem
  61. cliente (WebSocketBridge) Worker (comando Django) Channels Backend (armazenamento) ASGI (o

    novo WSGI - Daphne) mensagem mensagem
  62. “Mas eu ainda preciso rodar meu servidor WSGI”

  63. Você ainda pode rodar WSGI e ASGI lado a lado,

    usando um proxy reverso para rotear as requisições para o servidor correto
  64. Worker Channels Backend cliente mensagem mensagem ASGI WSGI view proxy

    reverso requisição resposta
  65. Ou você pode só instalar Channels e executar $ python

    manage.py runserver
  66. Ou você pode só instalar Channels e executar $ python

    manage.py runserver **não recomendado para produção**
  67. Channels basicamente muda como Django se comporta para ser orientado

    à eventos
  68. Python Quiz

  69. Você pode dar uma olhada no projeto aqui: https://github.com/jonatasbaldin/wsquiz

  70. Tópicos para levar em consideração

  71. WebSocket possui TLS, por favor, use!

  72. WebSocket e Subprotocolos

  73. Testes, documentação e monitoramento

  74. Hoje, todos os browsers suportam WebSockets, mas escreva fallbacks em

    qualquer parte crítica
  75. Channels é um projeto novo, mas já é uma aplicação

    Django oficial
  76. DJANGO C H A N N E L E D

    @jonatasbaldin
  77. DJANGO C H A N N E L E D

    @jonatasbaldin o D é mudo