Twisted, Django i Websockety — demo
W poprzednim wpisie przedstawiłem architekturę server-side której obecnie używam oraz obiecałem zaprezentować przykładową aplikację Twisted która jej używa i jednocześnie:
- komunikuje się z klientem z użyciem WebSocketów
- łączy się do bazy za pośrednictwem
Django ORM
Proste demo dostępne jest tutaj (zgodne z hixie-76 oraz hybi-10). Polecam otworzenie go w przeglądarce Google Chrome oraz jednocześnie — w oknie incognito — aby przetestować komunikację między nimi.
Kod aplikacji Twisted wygląda następująco:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from twisted.application import service
from worker import Client, WorkerService, Django
import sys,setproctitle
class testclient (Client):
def onOpen (self,reconnect=False):
if reconnect:
print 'Client '+self.ident+' reconnected'
else:
print 'Client '+self.ident+' connected'
def onClose (self):
print 'Client '+self.ident+' disconnected'
def onRecv (self, ident, mesg):
if mesg == 'die':
# send message to self
self.send ('ok')
# and die
self.kill()
elif mesg == 'hello':
# send message to everyone including self
self.broadcast ('hi')
elif mesg == 'whoami':
if self.user:
self.send (self.user)
else:
self.send ('dunno')
else:
# send message to everyone else
self.unicast (mesg)
class demoapp (WorkerService):
def onStart(self):
print 'app has been started'
def onStop(self):
print 'app is being stopped'
def onTimer(self):
print '5 secs has been gone'
# setup
appname = 'demoapp.py'
Django.setdsm ('/srv/venv/blog')
application = service.Application (appname)
setproctitle.setproctitle (appname)
demoapp (testclient,terminate=False,onTimer=5).setServiceParent (application)
Kilka słów komentarza
from worker import Client, WorkerService, Django
worker to moja biblioteka dla aplikacji klienckich całej przedstawionej architektury. Składa się ze 150 linii kodu.
Użycie Django.setdsm z argumentem będącym scieżką do aplikacji Django umożliwia importowanie dowolnych bibliotek z tej konkretnej aplikacji.
Opcjonalny argument terminate=False w demoapp zapobiega rozłączanie klientów z frontendowego serwera, jeśli aplikacja jest wyłączana (lub restartowana). Po restarcie aplikacji "oczekujący klienci" są w do niej automatycznie łączeni (reconnect=True w onOpen).
onStart i onStop w klasie demoapp wywoływane są wiadomo kiedy, a dodatkowo można ustawić dowolną ilość timerów z dowolnymi nazwami i interwałami — przykładowo onTimer=5 spowoduje wywołanie funkcji onTimer klasy demoapp co 5 sekund.
Z poziomu obiektu klienta jest możliwy dostęp na parametrów sesji oraz użytkownika Django.
Do czego można to wykorzystać? Chociażby do czatów, live feedów czy do wyświetlania jakiegoś wykresu w czasie rzeczywistym.
Wszelkie opinie mile widziane!






