2010-09-27 5 views
7

Qualcuno potrebbe spiegare questa lineaCome capire questo codice del pallone? ?

g = LocalProxy(lambda: _request_ctx_stack.top.g) 

codice dalla boccetta

from werkzeug import LocalStack, LocalProxy 

# context locals 
_request_ctx_stack = LocalStack() 
current_app = LocalProxy(lambda: _request_ctx_stack.top.app) 
request = LocalProxy(lambda: _request_ctx_stack.top.request) 
session = LocalProxy(lambda: _request_ctx_stack.top.session) 
g = LocalProxy(lambda: _request_ctx_stack.top.g) 

codice locale è qui: http://pastebin.com/U3e1bEi0

+1

Lambda viene utilizzato perché LocalProxy() accetta un argomento di funzione. – tponthieux

risposta

4

Il Werkzeug documentation per LocalStack e LocalProxy potrebbe aiutare, così come alcuni di base comprensione di WSGI.

Appare ciò che sta accadendo è che viene creato uno stack globale (ma vuoto) _request_ctx_stack. Questo è disponibile per tutti i thread. Alcuni oggetti in stile WSGI (current_app, request, session e g) sono impostati per utilizzare l'elemento in cima allo stack globale.

A un certo punto, una o più applicazioni WSGI vengono inserite nello stack globale. Quindi, quando, ad esempio, viene utilizzato current_app in fase di esecuzione, viene utilizzata l'applicazione principale corrente. Se lo stack non viene mai inizializzato, top restituirà None e otterrai un'eccezione come AttributeError: 'NoneType' object has no attribute 'app'.

+6

Quasi corretto ma non completamente. _request_ctx_stack è una pila di contesti di richiesta, che contengono l'applicazione corrente, la richiesta, la sessione e le richieste globali. Questi contesti vengono inseriti in pila in base alle richieste, altrimenti non potrebbe funzionare. – DasIch