Twisted, Django i Websockety — demo

Autor: nme · piątek, 15 Lipiec, 2011 · Brak komentarzy · Tagi: django, twisted, websocket ·

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!

Zostaw komentarz