Tecnologie Web: Introduzione a Python
Organizzazione didattica
Sommario
Parte prima (10 minuti)
Parte seconda (25 minuti)
Parte terza (10 minuti)
Tecnologie Web: Introduzione a Python
Raffaele Montella
raffaele.montella@uniparthenope.it
https://github.com/raffmont/Tecnologie_Web-Introduzione_a_Python
Creative Commons Zero v1.0 Universal
Tecnologie Web
https://...//course/view.php?id=...
Prima parte del corso di Tecnologie Web.
Sviluppo Server Side
Integrazione
Architettura, Protocolli, Linguaggi a Marcatori, Aspetto
Scripting Client Side
Strumenti Server Side
recap
Tecnologie Web
https://...//course/view.php?id=...
Seconda parte del corso di Tecnologie Web
Architettura, Protocolli, Linguaggi a Marcatori, Aspetto
Scripting Client Side
Strumenti Server Side
Sviluppo Server Side
Integrazione
recap
Tecnologie Web
https://...//course/view.php?id=...
Terza parte del corso di Tecnologie Web
Architettura, Protocolli, Linguaggi a Marcatori, Aspetto
Scripting Client Side
Strumenti Server Side
Sviluppo Server Side
Integrazione
recap
Architettura di un’applicazione web
https://app.meteo.uniparthenope.it
meteo@uniparthenope
Web Server
index.html
manifest.json
sw.js
index.js
css/
js/
HTTP request
HTTP response
Application Server
Logica applicativa
Linguaggio [scripting] lato server
db
.nc
.nc
.nc
Servizi
Servizi
Servizi Web
HTTP request
HTTP response
HTTP request
HTTP response
Progressive Web App
Applicazioni mobile
native o ibride
Tecnologie Web & Python
https://www.tiobe.com/tiobe-index/
TIOBE Index, maggio 2021
Sviluppo Server Side
Integrazione
Strumenti Server Side
Quali i fattori del fenomeno conosciuto come “Escape from Java”?
Sommario
https://python.org
Presente nei sistemi operativi Unix-like (Linux, MacOS, ...), da installare su Windows.
Introduzione
https://en.wikipedia.org/wiki/Guido_van_Rossum
Van Rossum (Google, Dropbox, Microsoft), olandese, ha iniziato lo sviluppo di Python per hobby.
Caratteristiche
def fib(n):
if n<=1:
return 1
else:
return fib(n-1)+fib(n-2)
print(fib(24))
class Person:
def __init__(self, f, l):
self.first=f
self.last=l
person=Person("Jon","Snow")
$ cat > helloworld.py << EOF
> print("Hello Python World!")
> EOF
$ python helloworld.py
Hello Python World!
$ python3
Python 3.6.6 (v3.6.6:4cf1f54eb7, Jun 26 2018, 19:50:54)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 3/5
https://github.com/raffmont/Tecnologie_Web-Introduzione_a_Python
Repository del corso
fib.py
person.py
procedurale
oggetti
Sintassi - Blocco di codice
Un blocco di codice è:
def fact(n):
if n==0:
return 1
else:
return n*fact(n-1)
int fact(int n) {
if (n==0) {
return 1;
} else {
return n*fact(n-1);� }
}
fact.py
https://github.com/raffmont/Tecnologie_Web-Introduzione_a_Python
Repository del corso
fact.c
C
Sintassi - Blocco Globale (global scope)
# Global scope
name=input("Insert your name:")
print("Your number is",name)
# "main"
def main():
pass
if __name__ == "__main__":
main()
# Scopes
a="message a"
def A():
print("a:",a)
b="message b"
A()
print("b:",b)
global_scope.py
main.py
scopes.py
Sommario
https://python.org
Presente nei sistemi operativi Unix-like (Linux, MacOS, ...), da installare su Windows.
Variabili e tipi di dato
# variables 1
m="this is a message"
a=3
pi=3.1415
print(type(m),type(a),type(pi))
variables_1.py
<class 'str'> <class 'int'> <class 'float'>
# variables 2
a=4
b=2
c=a+b
d=a/b
print("c:",type(c),"d",type(d))
variables_2.py
c: <class 'int'> d <class 'float'>
Variabili e tipi di dato
# variables 3
a="abc"
print("a:",a,type(a))
a=3
print("a:",a,type(a))
variables_3.py
a: abc <class 'str'>
a: 3 <class 'int'>
# variables 4
a="abc"
b=1
c=1.5
d=True
e=3+5j
print("a:",type(a),"b",type(b),"c:",type(c),"d",type(d),"e",type(e))
variables_4.py
a: <class 'str'> b <class 'int'> c: <class 'float'> d: <class 'bool'> e: <class 'complex'>
Variabili e tipi di dato - operatori
Assegnazione
Aritmetici
Logici
Relazionali
= += -= *= /= %=
//= **= &= |= ^= >>=
<<=
+ - * / %
// (divisione intera)
** (potenza)
and
or
not
< <=
> >=
== !=
Bit a bit
& | ^ ~
<<
>>
Variabili e tipi di dato - operatori
Identità
Appartenenza
is
is not
in
not in
Restituisce True se ambo le variabili si riferiscono allo stesso oggetto.
Restituisce True se le due variabili non si riferiscono allo stesso oggetto.
Restituisce True se una sequenza è presente in un oggetto.
Restituisce True se una sequenza non è presente in un oggetto.
Variabili e tipi di dato - assegnazione multipla
# variables 5
a, b, c, d, e, f = 4, 8, 15, 16, 23, 42
print("a:",a,"f:",f)
variables_5.py
a: 4 f: 42
# swap
x = 3
y = 5
print("x:",x,"y:",y)
x, y = y, x
print("x:",x,"y:",y)
swap.py
x: 3 y: 5
x: 5 y: 3
In Python i valori di due variabili possono essere scambiati senza la tradizionale variabile di appoggio. Come mai? Come funziona la tipizzazione dinamica?
Variabili e tipi di dato - stringhe
# strings 1
message = "Hello Python World!"
print(message)
strings_1.py
Hello Python World!
# strings 2
s = "Ciao!"
print("s:",s,"len(s):",len(s))
print("s[0]:",s[0],"s[4]:",s[4])
strings_2.py
s: Ciao! len(s): 5
s[0]: C s[4]: !
# strings 3
s1 = "abc"; s2="defghijkl"; s=s1+s2
print(s)
strings_3.py
abcdefghijkl
Variabili e tipi di dato - stringhe
# strings 4
s = "abcdefghijkl"
print(s[2:7])
strings_4.py
cdefg
# strings 5
s = "abcdefghijkl"
print("s[:7]:",s[:7])
print("s[2:]:",s[2:])
strings_5.py
s[:7]: abcdefg
s[2:]: cdefghijkl
# strings 6
s = "abcdefghijkl"
print("s[:-2]:",s[:-2],"s[-7:]:",s[-7:])
s[:-2]: abcdefghij s[-7:]: fghijkl
strings_6.py
Variabili e tipi di dato - classi e oggetti
Tipizzazione dinamica
pi=3.1415
pi
3.1415
"3.1415"
Variabili e tipi di dato - classi e oggetti
# geopoint
class GeoPoint:
def __init__(self, lat, lon):
self.__lat=lat
self.__lon=lon
def getLat(self):
return self.__lat
def getLon(self):
return self.__lon
pos1=GeoPoint(40.85,14.28)
print(pos1.getLat(), pos1.getLon())
geopoint.py
40.85 14.28
Variabili e tipi di dato - classi e oggetti
# geopoint
class GeoPoint:
def __init__(self, lat, lon):
self.__lat=lat
self.__lon=lon
def getLat(self):
return self.__lat
def getLon(self):
return self.__lon
pos1=GeoPoint(40.85,14.28)
print(pos1.getLat(), pos1.getLon())
geopoint.py
40.85 14.28
Sommario
https://python.org
Strutture dati - liste - list()
# lists 1
items = ["apple",3.14,True]
print(len(items))
lists_1.py
3
# lists 2
fruits = ["apple","banana","raspberry","orange"]
print(len(fruits), fruits[2])
lists_2.py
# lists 3
avengers = []
avengers.append("Iron Man")
avengers.append("Cap. America")
avengers.append("Black Widow")
print(avengers)
4 raspberry
['Iron Man', 'Cap. America', 'Black Widow']
lists_3.py
Strutture dati - list()
# lists 4
f1 = ["apple","banana","raspberry"]
f2 = ["passionfruit","pineapple"]
fruits = f1 + f2
print(len(fruits), fruits)
lists_4.py
5 ['apple', 'banana', 'raspberry', 'passionfruit', 'pineapple']
# lists 5
l = [4, 8, 15, 16, 23, 42]
print("l[0]",l[0],"l[3:5]",l[3:5],"l[-1]",l[-1])
lists_5.py
l[0] 4 l[3:5] [16, 23] l[-1] 42
# lists 6
l = ["abc","def","ghi","jkl"];l[1]="xxx"
print("l:",l)
l: ['abc', 'xxx', 'ghi', 'jkl']
lists_6.py
Strutture dati - tuple()
# tuple 1
pos = (14.28, 40.85)
print(len(pos), type(pos))
tuple_1.py
2 <class 'tuple'>
# tuple 2
t = (4, 8, 15, 16, 23, 42)
x = (8, 2)
s = t+x
print("s:",s)
tuple_2.py
s: (4, 8, 15, 16, 23, 42, 8, 2)
# tuple 3
t = ("abc","def","ghi")
print("def?t:","def" in t,"jkl?t:","jkl" in t)
def?t: True jkl?t: False
tuple_3.py
Strutture dati - dizionari - dict()
# dict 1
person = {
"first":"Jon",
"last":"Snow"
}
print(len(person), person)
2 {'first': 'Jon', 'last': 'Snow'}
dict_1.py
# dict 2
person = { "first":"Jon" }
person["last"]="Snow"
print(type(person), person)
print("f:",person["first"])
print("l:",person["last"])
<class 'dict'> {'first': 'Jon', 'last': 'Snow'}
f: Jon
l: Snow
dict_2.py
Strutture dati - dizionari - dict()
# dict 3
course = {}
course["id"]="TW6"
course["isElective"]=True
course["topics"]=["C/S","HTTP","HTML","CSS","JavaScript","jQuery","PWA","Python"]
course["taughtBy"]={"first":"Raffaele","last":"Montella"}
print(course)
print(len(course),len(course["topics"]),len(course["taughtBy"]))
dict_3.py
{'id': 'TW6', 'isElective': True, 'topics': ['C/S', 'HTTP', 'HTML', 'CSS', 'JavaScript', 'jQuery', 'PWA', 'Python'], 'taughtBy': {'first': 'Raffaele', 'last': 'Montella'}}
4 8 2
Sommario
https://python.org
Presente nei sistemi operativi Unix-like (Linux, MacOS, ...), da installare su Windows.
if
condizione
...
S
s
Controllo del flusso - costrutto condizionale
# branching 1
import random
x = random.randint(1,100)
if x<33:
print("1st 3rd")
elif 33 <= x <= 66:
print("2nd 3rd")
else:
print("3rd 3rd")
branching_1.py
2nd 3rd
# branching 2
import random
a = random.randint(1,100)
b = random.randint(1,100)
m = a if a>0 else b
print("a:",a,"b:",b,"max:",m)
branching_2.py
a: 32 b: 24 max: 32
Controllo del flusso - ciclo while
# cycles 1
x=0
while x<100:
print("x:",x)
x=x+1
cycles_1.py
x: 0
x: 1
...
x: 99
# cycles 2
import random
while True:
x=random.randint(1,100)
if x==50:
break
print("x:",x)
cycles_2.py
x: 50
Controllo del flusso - ciclo for
# cycles 3
for x in range(100):
print("x:",x)
cycles_3.py
x: 0
x: 1
...
x: 99
# cycles 4
import random
s=""
for x in range(33,66,3):
s=s+str(x)+" "
print("s:",s)
cycles_4.py
s: 33 36 39 42 45 48 51 54 57 60 63
Sommario
https://python.org
Presente nei sistemi operativi Unix-like (Linux, MacOS, ...), da installare su Windows.
Funzioni e moduli
abs() | restituisce il valore assoluto di un numero |
input() | visualizza un testo, attende che l’utente inserisca da tastiera una serie di caratteri e prema il tasto Invio; restituisce la stringa inserita (da convertire eventualmente in un numero) |
eval() | valuta dinamicamente un’espressione fornita come stringa |
float() | trasforma l'argomento in un numero reale |
int() | trasforma l'argomento in un intero |
round() | arrotonda all'intero più vicino |
max() min() | restituiscono il massimo e il minimo in una lista di valori separati da virgole |
print() | stampa a video il contenuto inserito all’interno delle parentesi |
type() | restituisce il tipo di un dato |
range(n) | restituisce un elenco di n valori da 0 a n-1 |
range(i,f,s) | restituisce un elenco di valori da i(incluso) a f(escluso) step s |
Funzioni e moduli - passaggio di parametri
# funcs 1
def somma(a, b):
return a+b
print("s:",somma(10,9))
funcs_1.py
s: 19
# funcs 2
x=7
def inc(a):
a=a+1
return a
print("x:",x)
i=inc(x)
print("x:",x,"i:",i)
x: 7
x: 7 i: 8
funcs_2.py
Funzioni e moduli - i moduli
# mods 1
import random
print(random.randint(1,10))
mods_1.py
7
# mods 2
from random import randint
print(randint(1,10))
mods_2.py
5
# mods 3
from flask import Flask
app = Flask(__name__)
mods_3.py
ModuleNotFoundError: No module named 'flask'
Funzioni e moduli - i moduli
https://pypi.org
Python Package Index & Package Installer for Python
Funzioni e moduli - i moduli
https://github.com/fabiocaccamo/python-codicefiscale
Modulo Python per l’encoding, il decoding e la verifica del codice fiscale
$ python3 -m venv venv
$ . venv/bin/activate
(venv)$ pip install python-codicefiscale
Collecting python-codicefiscale
Downloading https://files.pythonhosted.org/packages/95/65/f6be1cc7a32c77e6478d61a48b15ec700331f75186f08977e538fc5b2abb/python-codicefiscale-0.3.7.tar.gz (131kB)
...
Running setup.py install for python-codicefiscale ... done
Successfully installed python-codicefiscale-0.3.7 python-dateutil-2.8.1 ...
Funzioni e moduli - i moduli
https://github.com/fabiocaccamo/python-codicefiscale
Modulo Python per l’encoding, il decoding e la verifica del codice fiscale
# mods 4
from codicefiscale import codicefiscale
person={
"surname":'Montella',
"name":'Raffaele',
"sex":'M',
"birthdate":'10/05/1972',
"birthplace":'Napoli'
}
result = codicefiscale.encode(
surname=person["surname"],
name=person["name"],
sex=person["sex"],
birthdate=person["birthdate"],
birthplace=person["birthplace"])
print(result)
mods_4.py
MNTRFL72E10F839I
Sommario
https://python.org
Presente nei sistemi operativi Unix-like (Linux, MacOS, ...), da installare su Windows.
Microframework Flask - introduzione
https://flask.palletsprojects.com
Flask
Microframework Flask - dipendenze
https://flask.palletsprojects.com
Flask
Microframework Flask - installazione
https://flask.palletsprojects.com/en/2.0.x/installation/
Installing Flask on Linux, MacOS and Windows
$ python3 -m venv venv
$ . venv/bin/activate
(venv)$ pip install Flask
Collecting Flask
Using cached https://files.pythonhosted.org/packages/bf/73/9180d22a40da68382e9cb6edb66a74bf09cb72ac825c130dce9c5a44198d/Flask-2.0.0-py3-none-any.whl
...
Installing collected packages: MarkupSafe, Jinja2, click, itsdangerous, dataclasses, Werkzeug, Flask
Successfully installed Flask-2.0.0 Jinja2-3.0.0 MarkupSafe-2.0.0 Werkzeug-2.0.0 click-8.0.0 dataclasses-0.8 itsdangerous-2.0.0
Microframework Flask - Hello World
# flask 1
from flask import Flask
app = Flask(__name__)
@app.route("/")
def root():
html='''
<html>
<head>
<title>Python Flask Hello World</title>
</head>
<body>
<h1>Hello Python Flask World!</h1>
</body>
</html>'''
return html
flask_1.py
Le funzioni di decorazione in Python sono un argomento avanzato che sarà approfondito in laboratorio.
Microframework Flask - Decorators
@app.route("/")
def root():
html='''
...
</html>'''
return html
Le funzioni di decorazione in Python sono un argomento avanzato che sarà approfondito in laboratorio.
def http_request_get_root(args):
...
html='''
...
</html>'''
...
return prepare_request(html)
app.route("/")
Microframework Flask - Hello World
$ export FLASK_APP=flask_1.py
$ export FLASK_ENV=debug
$ flask run -h 0.0.0.0 -p 5000
* Serving Flask app 'flask_1.py' (lazy loading)
* Environment: DEBUG
* Debug mode: off
* Running on all addresses.
WARNING: This is a development server. Do not use it in a production deployment.
* Running on http://192.168.1.32:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [16/May/2021 16:19:43] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [16/May/2021 16:19:43] "GET /favicon.ico HTTP/1.1" 404 -
https://github.com/raffmont/Tecnologie_Web-Introduzione_a_Python
Repository del corso
Microframework Flask - Semplice Web API
# flask 2
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/italian-fiscal-code")
def get_italian_fiscal_code():
result={ "fiscalCode":"MNTRFL72E10F839I" }
return jsonify(result)
flask_2.py
127.0.0.1 - - [16/May/2021 16:43:46] "GET /italian-fiscal-code HTTP/1.1" 200 -
$ export FLASK_APP=flask_2.py
$ export FLASK_ENV=debug
$ flask run -h 0.0.0.0 -p 5000
$ curl http://localhost:5000/italian-fiscal-code
{"fiscalCode":"MNTRFL72E10F839I"}
Eseguire l’applicazione flask_2.py
Invocare il servizio tramite un’altra shell
Microframework Flask - Web API Codice Fiscale
# flask 3
from flask import Flask, jsonify, request
from codicefiscale import codicefiscale
app = Flask(__name__)
@app.route("/italian-fiscal-code", methods=["POST"])
def italian_fiscal_code():
fiscal_code = codicefiscale.encode(
surname=request.form["surname"],
name=request.form["name"],
sex=request.form["sex"],
birthdate=request.form["birthdate"],
birthplace=request.form["birthplace"])
result={ "fiscalCode":fiscal_code }
return jsonify(result)
flask_3.py
Microframework Flask - Web API Codice Fiscale
127.0.0.1 - - [16/May/2021 17:07:25] "POST /italian-fiscal-code HTTP/1.1" 200 -
$ export FLASK_APP=flask_3.py
$ export FLASK_ENV=debug
$ flask run -h 0.0.0.0 -p 5000
$ curl --data "surname=montella&name=raffaele&sex=M&birthdate=10/05/1972&birthplace=Napoli" http://localhost:5000/italian-fiscal-code
{"fiscalCode":"MNTRFL72E10F839I"}
Eseguire l’applicazione flask_3.py
Invocare il servizio tramite un’altra shell
Per quale motivo è stato specificato che la funzione italian_fiscal_code deve essere invocata solo nel caso di richiesta tramite HTTP POST?
https://flask-restplus.readthedocs.io
Flask-REST+ è un plugin che consente la semplificazione dello sviluppo di REST Web Api.
Sommario
https://python.org
Presente nei sistemi operativi Unix-like (Linux, MacOS, ...), da installare su Windows.
Conclusioni
Approfondimenti
Funzioni e moduli - passaggio di parametri
# funcs 3
class Person:
def __init__(self, f, l):
self.first=f
self.last=l
def print(self):
print(self.first,self.last)
def swapFirstLast(p):
p.first,p.last = p.last,p.first
person=Person("Jon","Snow")
person.print()
swapFirstLast(person)
person.print()
funcs_3.py
Jon Snow
Snow Jon
Funzioni e moduli - bisezione
# funcs n
import random
data=[]
for x in range(100):
if random.randint(1,100)<33:
data.append(x)
def find(a,b,key):
i=round((a+b)/2)
if 0 <= i < len(data) and i != a and i != b:
if data[i]==key:
return i
if data[i]>key:
return find(a,i,key)
else:
return find(i,b,key)
return -1
print("i:",find(0,len(data)-1,50))
funcs_n.py
i: 19