De-Qua / v4w_website

A Flask-powered framework for the dequa web platform. Currently in development from full site to just API backend.
GNU Affero General Public License v3.0
4 stars 1 forks source link

Variabili global #97

Closed Lychfindel closed 4 years ago

Lychfindel commented 4 years ago

Issue vera e propria Bisogna cambiare tutte le nostre variabili global (quelle ad esempio utilizzate nei calcoli dei pesi del grafo) in attributi dell'oggetto flask.g. Ho aggiunto in interface una funzione per salvare i vari dati in g giusto per averlo un po' ordinato e avere tutte le variabili globali là. Dalle altre funzioni basterà fare un from flask import g e poi per accedere alla variabile g.la_tua_variabile

Spiegazione TLDR: In generale non utilizzare le variabili global di python, ma utilizzare flask.g.

Con le variabili global in flask bisogna fare moltissima attenzione, perché essendo globali in generale sopravvivono alle singole request e quindi si possono creare conflitti e casini se ci sono vari utenti che fanno request in contemporane. Una delle tante spiegazioni qua. Per farla semplice (da quel che ho capito) in flask ci sono tre modi per definire variabili globali, ed ognuno di questi dovrebbe essere usato solo per il suo caso specifico:

  1. global var: le tipiche variabili globali di python esistono per tutta la durata dell'esistenza dell'applicazione python. Va bene quindi usarle solo se non vengono cambiate dalle varie request e se sono variabili che devono essere condivise tra tutti gli utenti che accedono al sito
  2. flask.g: g sta per global, ed è la versione flask delle variabili global di python: la variabile è globale ma solo all'interno della singola request, ovvero da quando l'utente fa la richiesta al server a quando il server dà una response all'utente.
  3. flask.session: session è fondamentalmente il session cookie. È utile per salvare valori che sono relativi all'intera sessione dell'utente, quindi valori che potrebbero essere condivisi da diverse request del singolo utente.
freerafiki commented 4 years ago

Mi pare molto confondente (come si dice in italiano? non confuso, ma che confonde, vabbè, mi capite) il modo in cui viene definito g e il modo in cui noi usiamo le variabili globali.

Flask usa diversi concetti di richiesta, contesto, applicazione, che forse dovremmo studiare meglio o almeno definire meglio nel nostro codice. Nel fare le API possiamo anche migliorare questa cosa. Non che non funzioni, ma almeno a me (prima di oggi) non era chiaro che funzionasse così. Per capirci: chiamo richiesta una ricerca dell'utente, e il contesto della richiesta esiste solo mentre elaboriamo le informazioni cercate, poi muore. Questo è quello che viene salvato dentro la variabile g

Mi sembra che stiamo mischiando due cose: noi abbiamo due tipi di informazioni:

1 - informazioni che rimangono sempre uguali (path del file json per esempio) che non sono relativi a una richiesta (quindi non le metterei in g) e rimangono sempre uguali. Se le cambiamo, le cambiamo noi manualmente. Ora queste variabili sono definite in global_variables.py e ha senso perchè sono globali nel senso che sono comuni a tutto il codice ed è quello che vogliamo. 2 - informazioni che dipendono da quello che l'utente cerca (ponti, acqua, piedi, barca, off/on) che invece sono relative alla richiesta e cambiano. Queste vanno messe in g, come Ale ha fatto (ottimo punto, ci ho messo mille anni a capire sta cosa).

Conclusione: La variabile g per me confonde moltissimo. La variabile si riferisce alla richiesta e vive nel contesto della richiesta. Screen Shot 2020-10-29 at 11 13 45 Non è globale, e pertanto chiamarla g mi sembra terribile, ma tant'è. Armin (il creatore di Flask/Jinja) ne sa probabilmente più di noi.

Proposta: Le nostre variabili globali in global_variables.py sono effettivamente quello che noi offline programmatori chiameremmo globali. La mia proposta è di considerare queste variabili come parametri del sito e salvarle in una tabella del database (proposta che avevo già avanzato, ma reitero dopo aver studiato di più). Non cambia nulla dal punto di vista pratico, ma mi sembra più semplice dal punto di vista concettuale e di debug. Se una variabile viene cambiata, viene cambiata per tutte le prossime richieste al sito, e sopravvive anche se la webapp viene ricaricata (forse questa è una differenza con usare il file python). In più non abbiamo più il nome globale e quindi facciamo meno confusione. Le variabili della richiesta le salviamo su g, come ale ha già fatto, ora lo propago nel resto del codice. Io farei addirittura un attributo g.current_request e salverei tutto là (chiaramente nessun effetto sul codice python, solo sulla mia comprensione quando leggo), se non vi disturba.

freerafiki commented 4 years ago

questo secondo me l abbiamo fatto