2010-10-26 11 views
12

Stavo leggendo attraverso il doc Flask - e mi sono imbattuto this:Locali del contesto: in che modo rendono globali le variabili di contesto locali?

... Per le applicazioni web è fondamentale per reagire ai dati di un client inviato al server . In Flask questa informazione è fornita dall'oggetto di richiesta globale. Se hai una certa esperienza con Python ti starai chiedendo in che modo l'oggetto può essere globale e come Flask riesce a essere ancora sicuro. La risposta sono i locali di contesto ...

Ora ho capito i locali di contesto per essere roba come la dichiarazione with (certamente questo è ciò che il python 2.6 doc sembra suggerire). Sto lottando per vedere come questo ti permetterebbe di avere vars accessibili a livello globale che risiedono in uno spazio dei nomi locale? Come funziona concettualmente?

Inoltre: i globals sono generalmente considerati sporchi. Lo prendo, quindi perché è OK?

+3

E 'ok perché la macchia le variabili globali giù molto bene. – aaronasterling

risposta

4

In realtà sono oggetti proxy per gli oggetti reali, in modo che quando ne fai riferimento a un oggetto si ottenga l'accesso all'oggetto per il thread corrente.

Un esempio potrebbe essere l'oggetto request. È possibile vederlo configurato in globlals.py e quindi importato nello __init__.py per il pallone.

Il vantaggio di questo è che è possibile accedere alla richiesta di solo facendo

from flask import request 

e scrivere metodi come

@app.route('/') 
def hello_world(): 
    return "Hello World!" 

senza dover passare la richiesta intorno come parametro.

Questo sta facendo uso di alcune delle librerie di codici riutilizzabili da Werkzeug.

+0

Scusa se sono denso: ma se ottengo questo correttamente, spingono il contesto su una sorta di 'stackframe' e quindi sono in grado di indirizzare correttamente la chiamata attributo all'oggetto collegato corretto in base a questo stack? – Malang

+1

Se prendi una copia del [fonte per Werkzeug] (http://pypi.python.org/packages/source/W/Werkzeug/Werkzeug-0.6.2.tar.gz) e guarda in 'local.py' vedrai che la classe 'Local' usa fondamentalmente un dizionario con l'ID del thread corrente come chiave per archiviare e recuperare gli oggetti giusti in modo trasparente. Questo è il limite di ciò che posso dedurre senza impostare alcuni test per capire cosa sta facendo il codice. – mikej

+0

Non penso che sia necessario uno stack per quanto sopra. Questa è solo un'ipotesi, ma lo stack potrebbe semplicemente aggiungere un ulteriore livello relativo a questo commento nella documentazione a cui sei collegato: * Lo fa in modo intelligente che un'applicazione possa richiamare un'altra applicazione senza interruzioni. * – mikej

-2

namespace in pitone sono fondamentalmente dizionari si potrebbe fare

globals()['foo']=bar
+0

+1 punto buono:) – Malang

+0

Perché questo down è stato votato? Desidero che gli S/O abbiano fatto scendere i votanti per lasciare una spiegazione. Potrebbe essere un buon apprendimento. Potrei aver perso qualcosa, ma se uso l'ID del thread per "foo" sembra una variabile globale per-thread perfetta che è essenzialmente la stessa idea della risposta accettata.Python built-in 'dict' è thread-safe. –

Problemi correlati