On Thursday, January 5, 2012 10:14:45 AM UTC-5, Peter O wrote:
>
> http://web2py.com/books/default/chapter/29/5?search=globals%28%29


The globals being accessed in the above linked example (which is actually 
the 'welcome' app layout.html) are defined either in models or in another 
(included) view, not in a controller.
 

> I see. Am I right that View doesn't see the global variables (in 
> Controller), but the parent View sees the variables in View as global 
> variables?
>

It depends. An extended view sees variables defined in an extending view if 
(a) the variables are defined in the extending view before the {{extend}} 
directive, or (b) the variables are referenced in the extended view after 
the point where the extending view has been included. The sidebar example 
in 'welcome' linked above works via (a). Note that /default/index.html in 
'welcome' starts with:

{{left_sidebar_enabled,right_sidebar_enabled=False,True}}
{{extend 'layout.html'}}

By defining left_sidebar_enabled and right_sidebar_enabled before extending 
layout.html, those variables are defined before any of the layout.html code 
is executed, so they are available anywhere in layout.html (including 
within any other views included within layout.html). When executing a view, 
web2py first pieces together the entire page, with all extends and 
includes, and then it executes the Python code to generate the HTML.
 

> Then, what causes the difference between Example 1 and 2? What's the 
> relationship between the 'environment' and the 'context' in response? How 
> do I access the 'environment' explicitly in the Controller?
>

In your second example, you have:

response.render('default/test.html', globals()) 

Passing globals() to response.render() adds all the globals to the 
environment in which the view is rendered (actually, most of the objects in 
globals() are already in the view environment, so you are only really 
adding any new globals created in the controller). Your first example would 
be equivalent to:

response.render('default/test.html', dict()) 

which is simply equivalent to:

response.render('default/test.html') 

In that case, the view environment includes all the globals defined in the 
models (as well as the web2py framework globals), but you haven't added any 
variables generated in the controller to the view environment.

Anthony

Reply via email to