2010-09-27 13 views
7

Czy ktoś może wyjaśnić tę linięJak zrozumieć ten kod kolby? ?

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

z kolby

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) 

kod lokalny jest tutaj: http://pastebin.com/U3e1bEi0

+1

Lambda jest używana, ponieważ LocalProxy() przyjmuje argument funkcji. – tponthieux

Odpowiedz

4

Werkzeug documentation dla LocalStack i LocalProxy może pomóc, jak również niektóre podstawowe zrozumienie WSGI.

Wygląda na to, że tworzony jest globalny (ale pusty) stos _request_ctx_stack. Jest to dostępne dla wszystkich wątków. Niektóre obiekty w stylu WSGI (current_app, request, i g) są ustawione tak, aby używać górnego elementu w stosie globalnym.

W pewnym momencie jedna lub więcej aplikacji WSGI zostanie przeniesionych na stos globalny. Następnie, gdy na przykład w środowisku wykonawczym zostanie użyty kod current_app, zostanie użyta bieżąca aplikacja. Jeśli stos nigdy nie zostanie zainicjowany, to top zwróci Brak, a otrzymasz wyjątek, taki jak AttributeError: 'NoneType' object has no attribute 'app'.

+6

Prawie poprawne, ale nie do końca. _request_ctx_stack to stos kontekstów żądań, które przechowują bieżącą aplikację, żądanie, sesję i globale żądania. Te konteksty są przesyłane na stos na żądanie, w przeciwnym razie to nie może działać. – DasIch