2010-09-27 9 views
7

Podría alguien explicar esta línea¿Cómo entender este código de matraz? ?

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

código del frasco

código
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) 

del local está aquí: http://pastebin.com/U3e1bEi0

+1

Lambda se está utilizando porque LocalProxy() toma un argumento de función. – tponthieux

Respuesta

4

El Werkzeug documentation para LocalStack y LocalProxy podría ayudar, así como algunos básicos comprensión de WSGI.

Parece que lo que está pasando es que se crea una pila global (pero vacía) _request_ctx_stack. Esto está disponible para todos los hilos. Algunos objetos de estilo WSGI (current_app, request, session y g) están configurados para usar el elemento superior en la pila global.

En algún punto, una o más aplicaciones WSGI se insertan en la pila global. Luego, cuando, por ejemplo, se usa current_app en tiempo de ejecución, se utiliza la aplicación superior actual. Si la pila nunca se inicializa, la parte superior devolverá None y obtendrá una excepción como AttributeError: 'NoneType' object has no attribute 'app'.

+6

Casi correcto, pero no completamente. _request_ctx_stack es una pila de contextos de solicitud, que contienen la aplicación actual, la solicitud, la sesión y la solicitud global. Estos contextos se insertan en la pila por solicitud, de lo contrario, esto no podría funcionar. – DasIch

Cuestiones relacionadas