Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Come sviluppo le applicazioni web

10,836 views

Published on

Oggi possiamo finalmente lasciarci alle spalle l’idea di dover utilizzare PHP per lo sviluppo web. Durante la presentazione verrà spiegato un semplice workflow che utilizzo per lavorare con Python, Flask, SQLite, Apache e Git per ridurre i bug, semplificare il codice e ottimizzare i tempi di deployment.

Questo intervento ha fatto parte del Linux Day 2017.

Il video è disponibile qui: https://youtu.be/0Rwd75iHZN4

Published in: Software
  • Be the first to comment

  • Be the first to like this

Come sviluppo le applicazioni web

  1. 1. Come sviluppo le applicazioni web Andrea Lazzarotto — andrealazzarotto.com
  2. 2. Mi presento Sviluppatore software e consulente informatico Autore di vari software open source (script, RecuperaBit, …) Socio fondatore GrappaLUG
  3. 3. Percorso A proposito di PHP Sviluppare il software Fare il deploy
  4. 4. A proposito di PHP
  5. 5. Sviluppo web Tantissimi usano PHP (e MySQL) WordPress, Wikipedia, Digg, Facebook Parliamone...
  6. 6. Inconsistenza dei nomi strpos bin2hex usleep str_rot13 strtotime microtime
  7. 7. Riguardo a htmlspecialchars «htmlspecialchars fu una tra le prime funzioni. Al tempo in cui PHP aveva meno di 100 funzioni e il meccanismo di hashing per i nomi di funzione era strlen().» — Rasmus Lerdorf, creatore di PHP
  8. 8. I’m sick of this s***, don’t deny You’re a waste of time I’m sick of this s***, don’t ask why — Avril Lavigne, “I Can Do Better”
  9. 9. Tipi e operatori NULL < -1 NULL == 0 2000 == "2e3" Tutti questi confronti danno come risultato il valore TRUE
  10. 10. Ah ecco... «Non so come fermarlo, non c’era nessuna intenzione di scrivere un linguaggio di programmazione. […] Non ho idea di come si scriva un linguaggio di programmazione» — Rasmus Lerdorf, creatore di PHP
  11. 11. You’re so full of s*** I can’t stand the way you act I just can’t comprehend — Avril Lavigne, “I Can Do Better”
  12. 12. Messaggi di errore <?php $x = ?> syntax error, unexpected ';' function foo(string $s){} foo("hello world"); Argument 1 passed to foo() must be an instance of string, string given
  13. 13. Chi l’avrebbe mai detto! «Ero molto, molto scarso nello scrivere i parser. Sono ancora molto scarso nello scrivere i parser.» — Rasmus Lerdorf, creatore di PHP
  14. 14. I will drink as much limoncello as I can And I’ll do again and again — Avril Lavigne, “I Can Do Better”
  15. 15. Sviluppare il software
  16. 16. Oltre a bere per dimenticare…
  17. 17. Python I tipi di dato hanno senso I messaggi di errore hanno senso Facilissimo e “batterie incluse”
  18. 18. It’s a state of bliss, you think you’re dreaming It’s the happiness inside that you’re feeling It’s so beautiful it makes you wanna cry — Avril Lavigne, “Innocence”
  19. 19. Flask Micro-framework web per Python Poco invasivo, veloce da imparare Estendibile con altri moduli (es. Flask-Login)
  20. 20. Il workfow
  21. 21. Git Creazione repository: $ mkdir banana $ cd banana $ git init $ git remote add origin […] In remoto si può usare GitHub o Bitbucket File .gitignore: __pycache__/ *.py[cod] *$py.class *.so *.db *-journal config.py venv
  22. 22. Virtualenv Racchiude tutte le dipendenze in una directory! $ pip install virtualenv Nel nostro progetto: $ virtualenv venv $ source venv/bin/activate.fish Per chi usa Bash, c’è lo script activate
  23. 23. Scheletro del progetto Struttura: banana/ ├── banana.py Applicazione Flask ├── banana.wsgi Confgurazione per Apache ├── config.py File di confgurazione (escluso da Git) ├── config.py.example File di esempio (parametri fttizi) ├── requirements.txt Moduli Python da installare (Flask e altro) ├── static │   ├── favicon.ico Favicon (in realtà una PNG 128x128) │   └── robots.txt Indicazioni per i motori di ricerca └── templates └── home.html Template Jinja
  24. 24. File principale from flask import Flask, render_template, request, send_from_directory app = Flask(__name__) @app.route("/") def index(): return render_template('home.html') @app.route('/favicon.ico') @app.route('/robots.txt') def static_from_root(): return send_from_directory(app.static_folder, request.path[1:]) if __name__ == '__main__': app.run(port=5000, debug=True)
  25. 25. File per Apache WSGI import os import sys wd = os.path.dirname(os.path.realpath(__file__)) sys.path.insert(0, wd) from banana import app as application
  26. 26. Esempio di DB CREATE TABLE `guestbook` ( `date` TEXT NOT NULL, `name` TEXT NOT NULL ); $ sqlite3 data.db < data.sql
  27. 27. Aggiungiamo una rotta @app.route("/guestbook") def guestbook(): name = request.args.get('name') if name: message = 'Benvenuto {}!'.format(name) # TODO: inserire visita nel database con timestamp else: message = 'Mmm... chi sei?' return render_template('guestbook.html', message=message) Il template guestbook.html contiene: <h1>{{ message }}</h1>
  28. 28. Avviando ./banana.py
  29. 29. Fare il deploy
  30. 30. Flusso del codice
  31. 31. Proflo utente sul server # cd /var/www/ # mkdir Banana # adduser banana # chown banana:banana Banana # su banana
  32. 32. Clone del repository $ git clone git@github.com:Lazza/flask-banana.git /var/www/Banana $ cd /var/www/Banana $ pip install -u -r requirements.txt $ sqlite3 data.db < data.sql $ cp config.py.example config.py $ nano config.py
  33. 33. Confgurazione di Apache <VirtualHost *:443> ServerName example.com ErrorLog ${APACHE_LOG_DIR}/banana_error.log CustomLog ${APACHE_LOG_DIR}/banana.log combined Alias /.well-known /var/www/Banana/.well-known WSGIDaemonProcess banana user=banana group=banana threads=20 WSGIScriptAlias / /var/www/Banana/banana.wsgi <Directory /var/www/Banana> WSGIProcessGroup banana WSGIApplicationGroup %{GLOBAL} Order deny,allow Allow from all </Directory> SSLEngine On SSLCertificateFile /path/fullchain.pem SSLCertificateKeyFile /path/privkey.pem </VirtualHost> Salvato in sites-available/banana.conf *:80 fa solo redirect a HTTPS # a2ensite banana
  34. 34. Successivi aggiornamenti dev@laptop $ git push banana@server $ git pull root@server # service apache2 reload
  35. 35. Grazie per l’attenzione Andrea Lazzarotto @thelazza https://andrealazzarotto.com

×