Talk di Luca Lusso | Drupal Day Roma 2011
Snellire il carico del server per generare e restituire un json da usare per un autocompletamento. Notificare che un nodo è stato appena creato a tutti gli utenti che stanno visitando il sito in questo momento. Oppure ancora mettere a disposizione degli utenti una chat in tempo reale. Tutto questo (e molto altro) si può delegare ad un processo esterno a Drupal per aumentare velocità di interazione e diminuire il carico del server.
Durante il talk si vedrà come installare e usare node.js e come integrarlo con Drupal. Verrà mostrato il modulo nodejs presente nel repository di drupal.org
MongoDB User Group Padova - Overviews iniziale su MongoDBStefano Dindo
MongoDB è un database non relazionale, orientato ai documenti. Classificato come un database di tipo NoSQL, MongoDB si allontana dalla struttura tradizionale basata su tabelle dei database relazionali in favore di documenti in stile JSON con schema dinamico (MongoDB chiama il formato BSON), rendendo l'integrazione di dati di alcuni tipi di applicazioni più facile e veloce.
Lo scopo del MongoDB User Group Padova è quello di condividere esperienze sulla tecnologia MongoDB.
Questa presentazione, usata durante il primo evento dello User Group, è stata usata per introdurre i partecipanti sulle procedure di installazione ed i concetti di base su MongoDB.
vSphere Inventory Browser for VMware ESX/vCenter 4.xSalvatore Saeli
Produzione di un'Inventory Browser per server di tipo VMware ESX/vCenter 4.x sfruttando strumenti e tecniche di ottimizzazione server-side e client-side.
##### Problematiche affrontate:
- Ottimizzazione del numero di oggetti da creare all’interno del server a ogni sessione
- Riduzione del traffico d’informazioni tra il client e il server per contenere l’uso della banda
- Gestione dei problemi di coerenza e sincronizzazione dei dati da mantenere sul client
### Server-side
- uso degli oggetti ViewManager e View per rendere performante l’uso del PropertyCollector
- meccanismo di notifica WaitForUpdate per un uso efficiente delle risorse di rete, rimane in standby in attesa di aggiornamenti
### Client-side
- albero n-ario implementato con tabelle hash,
mantiene l’intera struttura in memoria con accesso in tempo costante ai nodi ai vari livelli dell’albero
- tecniche di multi-threading (C#) per ottenere l'esecuzione in parallelo delle operazione eseguite in background e la sincronizzazione dei dati sugli oggetti del server
- tecnica di riflessione (C#), consente l'accesso alle proprietà degli oggetti di tipo ManagedEntity dall’Inventory UI Tree
Simple Cloud API: accesso semplificato al cloud computingFrancesca1980
In questa sessione verrà presentato il progetto open source Simple Cloud API per l'accesso semplificato ai servizi di cloud computing. Il progetto, nato dalla volontà di Zend Technologies, IBM e Microsoft, offre un API semplificata per l'accesso a differenti servizi di cloud computing. I servizi attualmente implementati sono di File Storage, Document Storage e Simple Queue sui sistemi cloud di Amazon, Windows Azure e Nirvanix (in futuro anche Rackspace e GoGrid). Nella presentazione, dopo una breve introduzione ai servizi di cloud computing ed alla loro rilevanza dal punto di vista dello sviluppo delle applicazioni web, verranno presentati degli esempi in PHP per l'utilizzo del Simple Cloud API
✦ Introduzione
✦ Connessioni TCP lato client: la classe
Socket
✦ Connessioni TCP lato server: la classe
ServerSocket
✦ Struttura di un server multi-threaded
Studio di una Architettura per un Sistema Distributivo ad Alta AffidabilitàRoberto Peruzzo
Questo documento rappresenta il risultato di uno studio di algoritmi e architetture utili per implementare un sistema ad alta affidabilit`a e alte prestazioni.
Structured Streaming è il modulo di Stream Processing costruito sul motore Spark SQL. In poche parole garantisce l'esecuzione di un messaggio esattamente una volta, è scalabile e fault-tolerant. È possibile definire le analisi stream nello stesso modo in cui si definirebbe un calcolo batch sui dati usando i Dataset/DataFrame API in Scala, Java, Python or R utilizzando l'engine SQL di Spark.
Durante la sessione vedremo un'overview delle funzionalità e un esempio di di come sia possibile eseguire l'ingestion dei dati con Event Hub (Kafka enabled) eseguire un'analisi con Spark e salvare i risultati su Cosmos DB.
[Laravel Day 2022] Deploy di Laravel su AWS Lambda (from Zero to Hero).pdfFrancesco Liuzzi
Grazie a Serverless e Bref.sh è possibile mettere (facilmente) online una web-app in Laravel su AWS. Vedremo come è possibile dar vita ad un’architettura complessa (con web server, object storage, code, database, cache e CDN) ad alta disponibiltà e scalabile, mantenendo un costo basso ed utilizzando esclusivamente servizi fully-managed.
Francesco Liuzzi
Progetto su iPhone - Seminario di Reti WirelessSilvio Daminato
"Simon says the color" è un'applicazione per iPhone sviluppata da Silvio Daminato e Andrea Giavatto per il progetto di Reti Wireless nell'anno accademico 2009/2010. È un gioco in cui un giocatore deve scattare una fotografia con un certo colore al centro dello schermo.
Le caratteristiche principali di questa applicazione sono descritte e viene dato qualche esempio di codice.
Simple Cloud API: accesso semplificato al cloud computingFrancesca1980
In questa sessione verrà presentato il progetto open source Simple Cloud API per l'accesso semplificato ai servizi di cloud computing. Il progetto, nato dalla volontà di Zend Technologies, IBM e Microsoft, offre un API semplificata per l'accesso a differenti servizi di cloud computing. I servizi attualmente implementati sono di File Storage, Document Storage e Simple Queue sui sistemi cloud di Amazon, Windows Azure e Nirvanix (in futuro anche Rackspace e GoGrid). Nella presentazione, dopo una breve introduzione ai servizi di cloud computing ed alla loro rilevanza dal punto di vista dello sviluppo delle applicazioni web, verranno presentati degli esempi in PHP per l'utilizzo del Simple Cloud API
✦ Introduzione
✦ Connessioni TCP lato client: la classe
Socket
✦ Connessioni TCP lato server: la classe
ServerSocket
✦ Struttura di un server multi-threaded
Studio di una Architettura per un Sistema Distributivo ad Alta AffidabilitàRoberto Peruzzo
Questo documento rappresenta il risultato di uno studio di algoritmi e architetture utili per implementare un sistema ad alta affidabilit`a e alte prestazioni.
Structured Streaming è il modulo di Stream Processing costruito sul motore Spark SQL. In poche parole garantisce l'esecuzione di un messaggio esattamente una volta, è scalabile e fault-tolerant. È possibile definire le analisi stream nello stesso modo in cui si definirebbe un calcolo batch sui dati usando i Dataset/DataFrame API in Scala, Java, Python or R utilizzando l'engine SQL di Spark.
Durante la sessione vedremo un'overview delle funzionalità e un esempio di di come sia possibile eseguire l'ingestion dei dati con Event Hub (Kafka enabled) eseguire un'analisi con Spark e salvare i risultati su Cosmos DB.
[Laravel Day 2022] Deploy di Laravel su AWS Lambda (from Zero to Hero).pdfFrancesco Liuzzi
Grazie a Serverless e Bref.sh è possibile mettere (facilmente) online una web-app in Laravel su AWS. Vedremo come è possibile dar vita ad un’architettura complessa (con web server, object storage, code, database, cache e CDN) ad alta disponibiltà e scalabile, mantenendo un costo basso ed utilizzando esclusivamente servizi fully-managed.
Francesco Liuzzi
Progetto su iPhone - Seminario di Reti WirelessSilvio Daminato
"Simon says the color" è un'applicazione per iPhone sviluppata da Silvio Daminato e Andrea Giavatto per il progetto di Reti Wireless nell'anno accademico 2009/2010. È un gioco in cui un giocatore deve scattare una fotografia con un certo colore al centro dello schermo.
Le caratteristiche principali di questa applicazione sono descritte e viene dato qualche esempio di codice.
Python: ottimizzazione numerica algoritmi geneticiPyCon Italia
The document discusses using Python for numerical optimization and genetic algorithms. It covers topics like operations research applications of optimization, defining an optimization problem with decision variables and objectives, constraints, classifying objective functions as linear, non-linear smooth, or non-smooth, and using exact and heuristic methods like gradient descent and genetic algorithms to find optimal solutions. It provides an example of using SciPy's optimization functions to minimize objective functions with multiple variables.
This document summarizes key aspects of iteration in Python based on the provided document:
1. Python supports multiple ways of iteration including for loops and generators. For loops are preferred for iteration over finite collections while generators enable infinite iteration.
2. Common iteration patterns include iterating over elements, indices, or both using enumerate(). Numerical iteration can be done with for loops or while loops.
3. Functions are first-class objects in Python and can be passed as arguments or returned as values, enabling functional programming patterns like mapping and filtering.
This document discusses using Python code in the browser with Silverlight and IronPython. It begins with an introduction to Silverlight and IronPython, then provides examples of how to load the IronPython runtime, reference external Python files, and run Python code that interacts with the browser DOM and uses .NET APIs. Key points covered include loading the JavaScript that enables Python execution, how the Python runtime is loaded into the Silverlight control, and how Python code can import modules and packages to access libraries like unittest for testing purposes.
PyPy 1.2: snakes never crawled so fastPyCon Italia
The document outlines a presentation about PyPy 1.2 given on May 8, 2010. It discusses what's new in PyPy 1.2, including speed improvements from the just-in-time (JIT) compiler. It provides an overview of the JIT and demos how PyPy can be used now. The document also discusses what works and doesn't work on PyPy, such as most pure Python modules working but not all extension modules. Overall, PyPy 1.2 provides significant speed improvements over CPython and Psyco through its JIT compiler.
PyCuda: Come sfruttare la potenza delle schede video nelle applicazioni pythonPyCon Italia
The document discusses using PyCUDA to harness the power of GPUs with Python. It covers why GPUs are useful, how GPUs work, how to program them using CUDA and the CUDA execution model of threads arranged in blocks and grids. It then discusses how to use PyCUDA in Python including allocating memory on the GPU, copying data to and from the GPU, launching kernels, and handling errors.
OpenERP e l'arte della gestione aziendale con PythonPyCon Italia
OpenERP is a framework for business management applications that was created in 2003. It allows designing applications using Python objects, views, widgets and wizards. OpenERP also supports multi-platform installations and integration via XML-RPC. Version 6.0 was upcoming and included a new interface. Documentation and support resources include forums, wikis and IRC channels.
New and improved: Coming changes to the unittest modulePyCon Italia
The document discusses upcoming changes to the unittest testing framework in Python 2.7 and 3.2, including new assertion methods, type-specific equality functions, improved set and string comparison, and changes to command line behavior. Key changes are new assert methods, a delta parameter for assertAlmostEqual, deprecated aliases being removed, type-specific comparison functions, improved set and string handling, using assertRaises as a context manager, more command line options, and test discovery.
Monitoraggio del Traffico di Rete Usando Python ed ntopPyCon Italia
This document discusses integrating the network traffic monitoring tool ntop with Python. It describes ntop as an open source tool that supports network monitoring and management. It outlines previous attempts to add scripting to ntop using Perl and Lua, and explains why Python was ultimately chosen for its ease of use, features, and efficiency. The architecture of the ntop Python integration is presented, including how Python scripts can access ntop data and methods and generate dynamic web pages. Challenges and limitations of mixing ntop with Python are also covered.
Jython for embedded software validationPyCon Italia
This document discusses using Jython for embedded software validation. It proposes a runtime plugin model using Jython that allows dynamic code loading and multithreaded execution. This enables extending test automation capabilities and reusable test code. The model is implemented using Jython embedded in Eclipse, providing benefits like cross-platform code and dynamic reloading while avoiding risks of mixed language development.
The document discusses Valentino Volonghi's presentation on effective use of Amazon EC2. It provides examples of how AdRoll migrated their infrastructure from self-hosted servers to using Amazon EC2 and other AWS services like S3 and CloudFront. It highlights benefits of EC2 like automatic scaling, easy software upgrades, low latency network access, and real-time monitoring. It also discusses strategies used for deploying application servers on EC2 using custom AMIs and boto monitoring.
This document discusses using Django for enterprise web applications. It begins with a brief overview of Django's core features like models, views, templates and forms. It then discusses aspects of enterprise applications including multi-tier architectures, web services, transactions, security and asynchronous messaging. The document argues that many enterprise needs can be met with Django and other Python tools while keeping things simple. It addresses potential concerns about scalability, deployments and monitoring Python applications in production.
Comet web applications with Python, Django & OrbitedPyCon Italia
The document discusses using Orbited, a Python library based on Twisted, to enable real-time communication and push notifications in Django web applications. Orbited supports STOMP, IRC and XMPP protocols and includes ready-to-use JavaScript client code. An example app is described that uses Django for the backend and Orbited/jQuery for real-time updates, with Django handling requests and sending messages to a STOMP server and Orbited/jQuery updating the browser. The document argues that asynchronous Python servers like Orbited are better suited than traditional approaches for handling long polling and push notifications at scale.
Cleanup and new optimizations in WPython 1.1PyCon Italia
This document summarizes optimizations and cleanup made to the WPython interpreter in version 1.1. Key changes include removing an unnecessary type object "hack" from version 1.0, fixing tracing for optimized loops, removing redundant checks and opcodes, adding new opcode functions, and implementing specialized opcodes for common patterns like comparisons.
Cleanup and new optimizations in WPython 1.1PyCon Italia
Ad
socket e SocketServer: il framework per i server Internet in Python
1. SOCKET E SOCKETSERVER
IL FRAMEWORK PER I SERVER INTERNET IN PYTHON
Marco Spisto, Giovanni Bajo
PyCon Italia Quattro
Firenze, 9 maggio 2010
2. SOMMARIO
• Servizi di rete con Python
• Modulo di basso livello: socket
• Modulo di alto livello: SocketServer
• Struttura del modulo
• Classi per il server
• Classi per la gestione della connessione client
• Gestione concorrente delle richieste
• Caso d’uso: il server HTTP della libreria standard
3. SERVIZI DI RETE CON PYTHON
• Basso livello: socket
Wrapper per il modulo implementato in C
• Alto livello: SocketServer
Framework costruito sul modulo socket
4. OGGETTI SOCKET
• Costruttore
socket(family, type)
• family
famiglia di indirizzi di rete (e.g.: IPv4)
• type
tipo di trasporto dati (e.g.: stream, datagrammi)
• Metodi per la comunicazione
• mysocket.recv(n_bytes)
ricezione (lettura) di al più n_bytes
• mysocket.send(data)
invio della stringa data
5. ESEMPIO 1
Client Server
collegamento al server configurazione e avvio
invio stringa di dati attesa connessione
ricezione dei dati dal server lettura dati inviati dal client
conversione dati in maiuscolo
invio dati elaborati al client
6. ESEMPIO 1: SERVER
import socket
HOST = "" # qualsiasi indirizzo disponibile sulla macchina che ospita il server
PORT = 10001 # porta TCP sulla quale il server si mette in ascolto
SIZE = 1024 # numero di byte da leggere
def start(indirizzo): def handle(connection):
# creazione del socket request, address = connection
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) print "Connessione da: %s:%d" % address
# configurazione # lettura dei dati inviati dal client
s.bind(indirizzo) data = request.recv(SIZE)
s.listen(5) print "-->", data
# attesa connessione # elaborazione dati ricevuti
client = s.accept() data = data.upper()
# gestione connessione # invio di dati al client
handle(client) request.send(data)
print "<--", data
# chiusura socket
s.close()
if __name__ == '__main__':
indirizzo = HOST, PORT
start(indirizzo)
7. ESEMPIO 1: CLIENT
import socket
HOST = "127.0.0.1" # indirizzo IPv4 della macchina che ospita il server
PORT = 10001 # porta TCP sulla quale il server si mette in ascolto
SIZE = 1024 # numero di byte da leggere
if __name__ == '__main__':
indirizzo = HOST, PORT
print "Connessione verso %s:%d" % indirizzo
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(indirizzo)
data = "ciao"
print "-->", data
s.send(data)
data = s.recv(SIZE)
print "<--", data
8. MODULO SOCKETSERVER
Strutturato con due classi principali
Server Handler
Implementazione Gestione
servizio client
N.B. in Python 3 il modulo si chiamerà socketserver
9. FUNZIONAMENTO DEL SERVER
• Classe principale: BaseServer
• Costruttore:
BaseServer(address, HandlerFactory)
• address
coppia: indirizzo, porta
• HandlerFactory
classe che viene istanziata
per gestire una singola connessione con il client
• Metodi di controllo:
• handle_request()
accettazione singola connessione
• serve_forever()
ciclo (infinito) di accettazione connessioni
10. ALCUNI SERVER A DISPOSIZIONE
BaseServer Classe di base
TCPServer Classe per server TCP
UDPServer Classe per server UDP
Le sottoclassi ridefiniscono il modo di inizializzare il server
11. FUNZIONAMENTO DELL’HANDLER
• Classe principale: BaseRequestHandler
• Il server accetta una connessione client e istanzia la classe
• Il costruttore di BaseRequestHandler:
• imposta i parametri della connessione
(indirizzo, socket del client, riferimento al server)
• chiama nell’ordine:
• self.setup()
• self.handle()
• self.finish()
12. ESEMPIO 2
Client Server
collegamento al server configurazione e avvio
invio stringa di dati attesa connessione
ricezione dei dati dal server lettura dati inviati dal client
conversione dati in maiuscolo
invio dati elaborati al client
Stesso funzionamento dell’esempio 1
Ma implementazione del server fatta con SocketServer
13. ESEMPIO 2: SERVER
import SocketServer
HOST = "" # qualsiasi indirizzo disponibile sulla macchina che ospita il server
PORT = 10002 # porta TCP sulla quale il server si mette in ascolto
SIZE = 1024 # numero di byte da leggere
class MyHandler(SocketServer.BaseRequestHandler):
"""Gestore della connessione del client."""
def handle(self):
"""Metodo da sovrascrivere per gestire la richiesta."""
print "Connessione da: %s:%d" % self.client_address
# lettura dei dati inviati dal client
data = self.request.recv(SIZE)
print "-->", data
# elaborazione dati ricevuti
data = data.upper()
# invio di dati al client
self.request.send(data)
print "<--", data
if __name__ == '__main__':
indirizzo = HOST, PORT
SocketServer.TCPServer.allow_reuse_address = True
server = SocketServer.TCPServer(indirizzo, MyHandler)
server.handle_request()
14. ESEMPIO 3
• Server che comunica l’orario corrente al client
• Richiesti username e password per l’accesso ai servizi
• Il server controlla la coppia di dati e:
• dati corretti:
invia l’orario corrente
• dati sbagliati:
nega il servizio
15. ESEMPIO 3
Client Server
collegamento al server ricezione username
invio username invio ACK
ricezione ACK ricezione password
invio password autenticazione
ricezione risposta server ...
... recupero orario corrente
conversione in float invio orario al client
stampa dell’orario
16. ESEMPIO 3: SERVER (1/2)
import SocketServer
import time
ADDRESS = "", 10003
SIZE = 1024
ACK = "x06"
USERNAME = "user"
PASSWORD = "pass"
class MyHandler(SocketServer.BaseRequestHandler):
def handle(self):
[... implementazione nella prossima slide ...]
if __name__ == '__main__':
SocketServer.TCPServer.allow_reuse_address = True
server = SocketServer.TCPServer(ADDRESS, MyHandler)
try:
server.serve_forever()
except KeyboardInterrupt:
print
server.socket.close()
17. ESEMPIO 3: SERVER (2/2)
[...]
class MyHandler(SocketServer.BaseRequestHandler):
def handle(self):
print "Connessione da: %s:%d" % self.client_address
username = self.request.recv(SIZE) # ricezione username
self.request.send(ACK) # invio ACK
password = self.request.recv(SIZE) # ricezione password
# autenticazione
if (username, password) == (USERNAME, PASSWORD):
# invio di dati al client
data = str(time.time())
self.request.send(data)
print "Orario corrente:", data
else:
# autenticazione fallita
print "Username/password errate"
print
[...]
18. ESEMPIO 3: CLIENT
import socket
import sys
import datetime
ADDRESS = "127.0.0.1", 10003
SIZE = 1024
if __name__ == '__main__':
# username e password passati come argomenti al programma
USERNAME = sys.argv[1]
PASSWORD = sys.argv[2]
print "Connessione verso %s:%d" % ADDRESS
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(ADDRESS)
s.send(USERNAME) # invio username
s.recv(1) # ricezione ACK
s.send(PASSWORD) # invio password
data = s.recv(SIZE)
if data != "":
data = float(data)
print datetime.datetime.fromtimestamp(data)
print
else:
sys.exit("Servizio negaton")
19. HANDLER A DISPOSIZIONE
BaseRequestHandler
StreamRequestHandler DatagramRequestHandler
Le sottoclassi sovrascrivono setup() e finish()
20. GESTIONE CONNESSIONI
CONCORRENTI
• BaseServer gestisce le connessioni in modo sequenziale
• A disposizione vi sono due classi:
• ThreadingMixIn
una connessione è associata a un thread
• ForkingMixIn
una connessione è associata a un processo
21. SERVER CON SOTTOPROCESSI
ForkingMixIn TCPServer
MyServer
class MyServer(ForkingMixIn, TCPServer):
[...
server che crea un sottoprocesso per ogni connessione client
...]
Comportamento specificato con il server, non con l’handler
22. ESEMPIO 4
• Server che invia file al client
• Problema
con file molto grandi e connessioni multiple
la coda si può riempire e le connessioni vengono rifiutate
• Soluzione
processi separati per gestire connessioni diverse
23. ESEMPIO 4
Client Server
collegamento al server attesa connessione
invio nome file richiesto creazione nuovo processo
ricezione dimensione file ricezione nome file
invio ACK invio dimensione file
ricezione file dal server ricezione ACK
invio del file richiesto
24. ESEMPIO 4: SERVER (1/2)
import SocketServer
import os
ADDRESS = "", 10004
SIZE = 1024
class MyHandler(SocketServer.BaseRequestHandler):
def handle(self):
[... implementazione nella prossima slide ...]
if __name__ == '__main__':
print "Server: %d" % os.getpid()
SocketServer.ForkingTCPServer.allow_reuse_address = True
server = SocketServer.ForkingTCPServer(ADDRESS, MyHandler)
try:
server.serve_forever()
except KeyboardInterrupt:
print
server.socket.close()
25. ESEMPIO 4: SERVER (2/2)
[...]
class MyHandler(SocketServer.BaseRequestHandler):
def handle(self):
print "Connessione da: %s:%d" % self.client_address
print "Processo: %d" % os.getpid()
# lettura nome file richiesto
path = self.request.recv(SIZE)
try:
# apertura file e lettura dati
data = open(path, "rb").read()
except OSError:
# file non trovato
self.request.send("0")
else:
total_size = len(data)
self.request.send(str(total_size)) # invio dimensione file
self.request.recv(1) # ricezione ACK
self.request.send(data) # invio file
[...]
26. ESEMPIO 4: CLIENT
import socket
import sys
ADDRESS = "127.0.0.1", 10004
SIZE = 1024
ACK = "x06"
if __name__ == '__main__':
# nome del file da scaricare passato come argomento al programma
NAME = sys.argv[1]
print "Connessione verso %s:%d" % ADDRESS
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(ADDRESS)
s.send(NAME) # nome del file da scaricare
total_size = int(s.recv(SIZE)) # dimensione file
s.send(ACK) # invio ACK
# ciclo di ricezione dati
data = s.recv(SIZE)
while len(data) < total_size:
data += s.recv(SIZE)
print "Ricevuti %d byte" % len(data)
27. CASO D’USO: MODULO
BASE HTTP SERVER
BaseHTTPServer è costruito su SocketServer
TCPServer StreamRequestHandler
HTTPServer BaseHTTPRequestHandler
28. FUNZIONAMENTO DI
BASE HTTP REQUEST HANDLER
• Essendo una sottoclasse di StreamRequestHandler
al socket sono associati due file:
• self.rfile
file aperto in lettura (ricezione di HTTP request)
• self.wfile
file aperto in scrittura (invio di HTTP response)
• Definisce handle() per:
• effettuare il parsing della HTTP request line
• effettuare il parsing degli header
• far proseguire l’elaborazione chiamando un metodo diverso in base all’HTTP
method del messaggio ricevuto
29. LOGICA DI handle()
handle() chiama un metodo di oggetto
corrispondente all’HTTP method del messaggio
HTTP method Metodo dell’handler
GET do_GET()
POST do_POST()
OTHER do_OTHER()
... ...
Le sottoclassi devono implementare un metodo do_*
per ogni HTTP method da gestire
30. ESEMPIO 5
• Server web che accetta comandi sh-like
• Il server legge il request URI del messaggio HTTP e ne estrae il
comando
• comando valido:
esegue il comando
invia una risposta al client con il risultato
• comando non valido:
invia una risposta di errore (400)
• E.G. http://localhost/pwd → esegue il comando pwd
• Implementazione del servizio nel metodo do_GET()
31. ESEMPIO 5: SERVER (1/2)
import BaseHTTPServer
import subprocess
ADDRESS = "", 10005
COMMANDS = "pwd", "ls", "uname", "date"
class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
[... implementazione nella prossima slide ...]
if __name__ == '__main__':
server = BaseHTTPServer.HTTPServer(ADDRESS, MyHandler)
try:
server.serve_forever()
except KeyboardInterrupt:
print
server.socket.close()
32. ESEMPIO 5: SERVER (2/2)
[...]
class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
"""MyHandler non ridefinisce handle(), segue una logica di livello superiore.
"""
def do_GET(self):
"""Gestione degli HTTP request con HTTP method = GET"""
print "Connessione da: %s:%d" % self.client_address
print
# lettura del path per ricavare il comando
# primo carattere escluso: l’URI inizia con lo slash "/"
cmd = self.path[1:]
# controllo comando valido
if cmd in COMMANDS:
output = subprocess.Popen([cmd], stdout=subprocess.PIPE, shell=True).stdout.read()
self.send_response(200)
self.end_headers()
self.wfile.write(output)
else:
self.send_error(400)
[...]
33. ESEMPIO 5: CLIENT
• Come client può essere usato un browser qualsiasi
• Oppure si può usare il modulo urllib2
import urllib2
import sys
ADDRESS = "127.0.0.1", 10005
if __name__ == '__main__':
# comando da eseguire passato come argomento al programma
COMMAND = sys.argv[1]
URI = "http://%s:%d/%s" % (ADDRESS[0], ADDRESS[1], COMMAND)
print URI
print
try:
r = urllib2.urlopen(URI)
print "HTTP Status Code:", r.code
print r.read()
except urllib2.HTTPError as e:
print e
34. PER SAPERNE DI PIÙ
• Tanembaum, A. S (2003). Reti di calcolatori (IV ed.).
Addison wesley
• AA.VV. (2010). “socket – Low-level networking interface.”
Sez. 17.2 in The Python Standard Library.
Python v2.6.5, http://docs.python.org/library/socket.html
• AA.VV. (2010). “SocketServer – A framework for network servers.”
Sez. 20.17 in The Python Standard Library.
Python v2.6.5, http://docs.python.org/library/socketserver.html
• AA.VV. (2010). “BaseHTTPServer – Basic HTTP server.”
Sez. 20.18 in The Python Standard Library.
Python v2.6.5, http://docs.python.org/library/basehttpserver.html