1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359
|
<html>
<head>
<title>pylons.templating</title>
</head>
<body>
pylons.templating
<style>
.coverage pre {float: left; margin: 0px 1em; border: none;
padding: 0px; }
.num pre { margin: 0px }
.nocov, .nocov pre {background-color: #faa}
.cov, .cov pre {background-color: #cfc}
div.coverage div { clear: both; height: 1.1em}
</style>
<div class="stats">
Covered: 160 lines<br/>
Missed: 72 lines<br/>
Skipped 102 lines<br/>
Percent: 68 %<br/>
</div>
<div class="coverage">
<div class="cov"><span class="num"><pre> 1</pre></span><pre>"""Render functions and helpers</pre></div>
<div class="skip"><span class="num"><pre> 2</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 3</pre></span><pre>Render functions and helpers</pre></div>
<div class="cov"><span class="num"><pre> 4</pre></span><pre>============================</pre></div>
<div class="skip"><span class="num"><pre> 5</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 6</pre></span><pre>:mod:`pylons.templating` includes several basic render functions,</pre></div>
<div class="cov"><span class="num"><pre> 7</pre></span><pre>:func:`render_mako`, :func:`render_genshi` and :func:`render_jinja2`</pre></div>
<div class="cov"><span class="num"><pre> 8</pre></span><pre>that render templates from the file-system with the assumption that</pre></div>
<div class="cov"><span class="num"><pre> 9</pre></span><pre>variables intended for the will be attached to :data:`tmpl_context`</pre></div>
<div class="cov"><span class="num"><pre> 10</pre></span><pre>(hereafter referred to by its short name of :data:`c` which it is</pre></div>
<div class="cov"><span class="num"><pre> 11</pre></span><pre>commonly imported as).</pre></div>
<div class="skip"><span class="num"><pre> 12</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 13</pre></span><pre>The default render functions work with the template language loader</pre></div>
<div class="cov"><span class="num"><pre> 14</pre></span><pre>object that is setup on the :data:`app_globals` object in the project's</pre></div>
<div class="cov"><span class="num"><pre> 15</pre></span><pre>:file:`config/environment.py`.</pre></div>
<div class="skip"><span class="num"><pre> 16</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 17</pre></span><pre>Usage</pre></div>
<div class="cov"><span class="num"><pre> 18</pre></span><pre>-----</pre></div>
<div class="skip"><span class="num"><pre> 19</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 20</pre></span><pre>Generally, one of the render functions will be imported in the</pre></div>
<div class="cov"><span class="num"><pre> 21</pre></span><pre>controller. Variables intended for the template are attached to the</pre></div>
<div class="cov"><span class="num"><pre> 22</pre></span><pre>:data:`c` object. The render functions return unicode (they actually</pre></div>
<div class="cov"><span class="num"><pre> 23</pre></span><pre>return :class:`~webhelpers.html.literal` objects, a subclass of</pre></div>
<div class="cov"><span class="num"><pre> 24</pre></span><pre>unicode).</pre></div>
<div class="skip"><span class="num"><pre> 25</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 26</pre></span><pre>.. admonition :: Tip</pre></div>
<div class="skip"><span class="num"><pre> 27</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre> 28</pre></span><pre> :data:`tmpl_context` (template context) is abbreviated to :data:`c`</pre></div>
<div class="cov"><span class="num"><pre> 29</pre></span><pre> instead of its full name since it will likely be used extensively</pre></div>
<div class="cov"><span class="num"><pre> 30</pre></span><pre> and it's much faster to use :data:`c`. Of course, for users that</pre></div>
<div class="cov"><span class="num"><pre> 31</pre></span><pre> can't tolerate one-letter variables, feel free to not import </pre></div>
<div class="cov"><span class="num"><pre> 32</pre></span><pre> :data:`tmpl_context` as :data:`c` since both names are available in</pre></div>
<div class="cov"><span class="num"><pre> 33</pre></span><pre> templates as well.</pre></div>
<div class="skip"><span class="num"><pre> 34</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 35</pre></span><pre>Example of rendering a template with some variables::</pre></div>
<div class="skip"><span class="num"><pre> 36</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 37</pre></span><pre> from pylons import tmpl_context as c</pre></div>
<div class="cov"><span class="num"><pre> 38</pre></span><pre> from pylons.templating import render_mako as render</pre></div>
<div class="skip"><span class="num"><pre> 39</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 40</pre></span><pre> from sampleproject.lib.base import BaseController</pre></div>
<div class="skip"><span class="num"><pre> 41</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 42</pre></span><pre> class SampleController(BaseController):</pre></div>
<div class="skip"><span class="num"><pre> 43</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 44</pre></span><pre> def index(self):</pre></div>
<div class="cov"><span class="num"><pre> 45</pre></span><pre> c.first_name = "Joe"</pre></div>
<div class="cov"><span class="num"><pre> 46</pre></span><pre> c.last_name = "Smith"</pre></div>
<div class="cov"><span class="num"><pre> 47</pre></span><pre> return render('/some/template.mako')</pre></div>
<div class="skip"><span class="num"><pre> 48</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 49</pre></span><pre>And the accompanying Mako template:</pre></div>
<div class="skip"><span class="num"><pre> 50</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 51</pre></span><pre>.. code-block:: mako</pre></div>
<div class="skip"><span class="num"><pre> 52</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre> 53</pre></span><pre> Hello ${c.first name}, I see your lastname is ${c.last_name}!</pre></div>
<div class="skip"><span class="num"><pre> 54</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 55</pre></span><pre>Your controller will have additional default imports for commonly used</pre></div>
<div class="cov"><span class="num"><pre> 56</pre></span><pre>functions.</pre></div>
<div class="skip"><span class="num"><pre> 57</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 58</pre></span><pre>Template Globals</pre></div>
<div class="cov"><span class="num"><pre> 59</pre></span><pre>----------------</pre></div>
<div class="skip"><span class="num"><pre> 60</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 61</pre></span><pre>Templates rendered in Pylons should include the default Pylons globals</pre></div>
<div class="cov"><span class="num"><pre> 62</pre></span><pre>as the :func:`render_mako`, :func:`render_genshi` and</pre></div>
<div class="cov"><span class="num"><pre> 63</pre></span><pre>:func:`render_jinja2` functions. The full list of Pylons globals that</pre></div>
<div class="cov"><span class="num"><pre> 64</pre></span><pre>are included in the template's namespace are:</pre></div>
<div class="skip"><span class="num"><pre> 65</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 66</pre></span><pre>- :term:`c` -- Template context object</pre></div>
<div class="cov"><span class="num"><pre> 67</pre></span><pre>- :term:`tmpl_context` -- Template context object</pre></div>
<div class="cov"><span class="num"><pre> 68</pre></span><pre>- :data:`config` -- Pylons :class:`~pylons.configuration.PylonsConfig`</pre></div>
<div class="cov"><span class="num"><pre> 69</pre></span><pre> object (acts as a dict)</pre></div>
<div class="cov"><span class="num"><pre> 70</pre></span><pre>- :term:`app_globals` -- Project application globals object</pre></div>
<div class="cov"><span class="num"><pre> 71</pre></span><pre>- :term:`h` -- Project helpers module reference</pre></div>
<div class="cov"><span class="num"><pre> 72</pre></span><pre>- :data:`request` -- Pylons :class:`~pylons.controllers.util.Request`</pre></div>
<div class="cov"><span class="num"><pre> 73</pre></span><pre> object for this request</pre></div>
<div class="cov"><span class="num"><pre> 74</pre></span><pre>- :data:`response` -- Pylons :class:`~pylons.controllers.util.Response`</pre></div>
<div class="cov"><span class="num"><pre> 75</pre></span><pre> object for this request</pre></div>
<div class="cov"><span class="num"><pre> 76</pre></span><pre>- :class:`session` -- Pylons session object (unless Sessions are</pre></div>
<div class="cov"><span class="num"><pre> 77</pre></span><pre> removed)</pre></div>
<div class="cov"><span class="num"><pre> 78</pre></span><pre>- :class:`url <routes.util.URLGenerator>` -- Routes url generator</pre></div>
<div class="cov"><span class="num"><pre> 79</pre></span><pre> object</pre></div>
<div class="cov"><span class="num"><pre> 80</pre></span><pre>- :class:`translator` -- Gettext translator object configured for</pre></div>
<div class="cov"><span class="num"><pre> 81</pre></span><pre> current locale</pre></div>
<div class="cov"><span class="num"><pre> 82</pre></span><pre>- :func:`ungettext` -- Unicode capable version of gettext's ngettext</pre></div>
<div class="cov"><span class="num"><pre> 83</pre></span><pre> function (handles plural translations)</pre></div>
<div class="cov"><span class="num"><pre> 84</pre></span><pre>- :func:`_` -- Unicode capable gettext translate function</pre></div>
<div class="cov"><span class="num"><pre> 85</pre></span><pre>- :func:`N_` -- gettext no-op function to mark a string for</pre></div>
<div class="cov"><span class="num"><pre> 86</pre></span><pre> translation, but doesn't actually translate</pre></div>
<div class="skip"><span class="num"><pre> 87</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 88</pre></span><pre>Configuring the template language</pre></div>
<div class="cov"><span class="num"><pre> 89</pre></span><pre>---------------------------------</pre></div>
<div class="skip"><span class="num"><pre> 90</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 91</pre></span><pre>The template engine is created in the projects </pre></div>
<div class="cov"><span class="num"><pre> 92</pre></span><pre>``config/environment.py`` and attached to the ``app_globals`` (g)</pre></div>
<div class="cov"><span class="num"><pre> 93</pre></span><pre>instance. Configuration options can be directly passed into the</pre></div>
<div class="cov"><span class="num"><pre> 94</pre></span><pre>template engine, and are used by the render functions.</pre></div>
<div class="skip"><span class="num"><pre> 95</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 96</pre></span><pre>.. warning::</pre></div>
<div class="skip"><span class="num"><pre> 97</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre> 98</pre></span><pre> Don't change the variable name on :data:`app_globals` that the</pre></div>
<div class="cov"><span class="num"><pre> 99</pre></span><pre> template loader is attached to if you want to use the render_*</pre></div>
<div class="cov"><span class="num"><pre>100</pre></span><pre> functions that :mod:`pylons.templating` comes with. The render_*</pre></div>
<div class="cov"><span class="num"><pre>101</pre></span><pre> functions look for the template loader to render the template.</pre></div>
<div class="skip"><span class="num"><pre>102</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>103</pre></span><pre>"""</pre></div>
<div class="cov"><span class="num"><pre>104</pre></span><pre>import logging</pre></div>
<div class="skip"><span class="num"><pre>105</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>106</pre></span><pre>from webhelpers.html import literal</pre></div>
<div class="skip"><span class="num"><pre>107</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>108</pre></span><pre>import pylons</pre></div>
<div class="skip"><span class="num"><pre>109</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>110</pre></span><pre>__all__ = ['render_genshi', 'render_jinja2', 'render_mako', 'render_response']</pre></div>
<div class="skip"><span class="num"><pre>111</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>112</pre></span><pre>PYLONS_VARS = ['c', 'app_globals', 'config', 'h', 'render', 'request',</pre></div>
<div class="cov"><span class="num"><pre>113</pre></span><pre> 'session', 'translator', 'ungettext', '_', 'N_']</pre></div>
<div class="skip"><span class="num"><pre>114</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>115</pre></span><pre>log = logging.getLogger(__name__)</pre></div>
<div class="skip"><span class="num"><pre>116</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>117</pre></span><pre>def pylons_globals():</pre></div>
<div class="cov"><span class="num"><pre>118</pre></span><pre> """Create and return a dictionary of global Pylons variables</pre></div>
<div class="skip"><span class="num"><pre>119</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre>120</pre></span><pre> Render functions should call this to retrieve a list of global</pre></div>
<div class="cov"><span class="num"><pre>121</pre></span><pre> Pylons variables that should be included in the global template</pre></div>
<div class="cov"><span class="num"><pre>122</pre></span><pre> namespace if possible.</pre></div>
<div class="skip"><span class="num"><pre>123</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre>124</pre></span><pre> Pylons variables that are returned in the dictionary:</pre></div>
<div class="cov"><span class="num"><pre>125</pre></span><pre> ``c``, ``h``, ``_``, ``N_``, config, request, response, </pre></div>
<div class="cov"><span class="num"><pre>126</pre></span><pre> translator, ungettext, ``url``</pre></div>
<div class="skip"><span class="num"><pre>127</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre>128</pre></span><pre> If SessionMiddleware is being used, ``session`` will also be</pre></div>
<div class="cov"><span class="num"><pre>129</pre></span><pre> available in the template namespace.</pre></div>
<div class="skip"><span class="num"><pre>130</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre>131</pre></span><pre> """</pre></div>
<div class="nocov"><span class="num"><pre>132</pre></span><pre> conf = pylons.config._current_obj()</pre></div>
<div class="nocov"><span class="num"><pre>133</pre></span><pre> c = pylons.tmpl_context._current_obj()</pre></div>
<div class="nocov"><span class="num"><pre>134</pre></span><pre> app_globals = conf.get('pylons.app_globals')</pre></div>
<div class="nocov"><span class="num"><pre>135</pre></span><pre> pylons_vars = dict(</pre></div>
<div class="nocov"><span class="num"><pre>136</pre></span><pre> c=c,</pre></div>
<div class="nocov"><span class="num"><pre>137</pre></span><pre> tmpl_context=c,</pre></div>
<div class="nocov"><span class="num"><pre>138</pre></span><pre> config=conf,</pre></div>
<div class="nocov"><span class="num"><pre>139</pre></span><pre> app_globals=app_globals,</pre></div>
<div class="nocov"><span class="num"><pre>140</pre></span><pre> h=conf.get('pylons.h'),</pre></div>
<div class="nocov"><span class="num"><pre>141</pre></span><pre> request=pylons.request._current_obj(),</pre></div>
<div class="nocov"><span class="num"><pre>142</pre></span><pre> response=pylons.response._current_obj(),</pre></div>
<div class="nocov"><span class="num"><pre>143</pre></span><pre> url=pylons.url._current_obj(),</pre></div>
<div class="nocov"><span class="num"><pre>144</pre></span><pre> translator=pylons.translator._current_obj(),</pre></div>
<div class="nocov"><span class="num"><pre>145</pre></span><pre> ungettext=pylons.i18n.ungettext,</pre></div>
<div class="nocov"><span class="num"><pre>146</pre></span><pre> _=pylons.i18n._,</pre></div>
<div class="nocov"><span class="num"><pre>147</pre></span><pre> N_=pylons.i18n.N_</pre></div>
<div class="nocov"><span class="num"><pre>148</pre></span><pre> )</pre></div>
<div class="skip"><span class="num"><pre>149</pre></span><pre> </pre></div>
<div class="skip"><span class="num"><pre>150</pre></span><pre> # If the session was overriden to be None, don't populate the session</pre></div>
<div class="skip"><span class="num"><pre>151</pre></span><pre> # var</pre></div>
<div class="nocov"><span class="num"><pre>152</pre></span><pre> econf = pylons.config['pylons.environ_config']</pre></div>
<div class="nocov"><span class="num"><pre>153</pre></span><pre> if 'beaker.session' in pylons.request.environ or \</pre></div>
<div class="nocov"><span class="num"><pre>154</pre></span><pre> ('session' in econf and econf['session'] in pylons.request.environ):</pre></div>
<div class="nocov"><span class="num"><pre>155</pre></span><pre> pylons_vars['session'] = pylons.session._current_obj()</pre></div>
<div class="nocov"><span class="num"><pre>156</pre></span><pre> log.debug("Created render namespace with pylons vars: %s", pylons_vars)</pre></div>
<div class="nocov"><span class="num"><pre>157</pre></span><pre> return pylons_vars</pre></div>
<div class="skip"><span class="num"><pre>158</pre></span><pre></pre></div>
<div class="skip"><span class="num"><pre>159</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>160</pre></span><pre>def cached_template(template_name, render_func, ns_options=(),</pre></div>
<div class="cov"><span class="num"><pre>161</pre></span><pre> cache_key=None, cache_type=None, cache_expire=None,</pre></div>
<div class="cov"><span class="num"><pre>162</pre></span><pre> **kwargs):</pre></div>
<div class="cov"><span class="num"><pre>163</pre></span><pre> """Cache and render a template</pre></div>
<div class="skip"><span class="num"><pre>164</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre>165</pre></span><pre> Cache a template to the namespace ``template_name``, along with a</pre></div>
<div class="cov"><span class="num"><pre>166</pre></span><pre> specific key if provided.</pre></div>
<div class="skip"><span class="num"><pre>167</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre>168</pre></span><pre> Basic Options</pre></div>
<div class="skip"><span class="num"><pre>169</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre>170</pre></span><pre> ``template_name``</pre></div>
<div class="cov"><span class="num"><pre>171</pre></span><pre> Name of the template, which is used as the template namespace.</pre></div>
<div class="cov"><span class="num"><pre>172</pre></span><pre> ``render_func``</pre></div>
<div class="cov"><span class="num"><pre>173</pre></span><pre> Function used to generate the template should it no longer be</pre></div>
<div class="cov"><span class="num"><pre>174</pre></span><pre> valid or doesn't exist in the cache.</pre></div>
<div class="cov"><span class="num"><pre>175</pre></span><pre> ``ns_options``</pre></div>
<div class="cov"><span class="num"><pre>176</pre></span><pre> Tuple of strings, that should correspond to keys likely to be</pre></div>
<div class="cov"><span class="num"><pre>177</pre></span><pre> in the ``kwargs`` that should be used to construct the</pre></div>
<div class="cov"><span class="num"><pre>178</pre></span><pre> namespace used for the cache. For example, if the template</pre></div>
<div class="cov"><span class="num"><pre>179</pre></span><pre> language supports the 'fragment' option, the namespace should</pre></div>
<div class="cov"><span class="num"><pre>180</pre></span><pre> include it so that the cached copy for a template is not the</pre></div>
<div class="cov"><span class="num"><pre>181</pre></span><pre> same as the fragment version of it.</pre></div>
<div class="skip"><span class="num"><pre>182</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre>183</pre></span><pre> Caching options (uses Beaker caching middleware)</pre></div>
<div class="skip"><span class="num"><pre>184</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre>185</pre></span><pre> ``cache_key``</pre></div>
<div class="cov"><span class="num"><pre>186</pre></span><pre> Key to cache this copy of the template under.</pre></div>
<div class="cov"><span class="num"><pre>187</pre></span><pre> ``cache_type``</pre></div>
<div class="cov"><span class="num"><pre>188</pre></span><pre> Valid options are ``dbm``, ``file``, ``memory``, ``database``,</pre></div>
<div class="cov"><span class="num"><pre>189</pre></span><pre> or ``memcached``.</pre></div>
<div class="cov"><span class="num"><pre>190</pre></span><pre> ``cache_expire``</pre></div>
<div class="cov"><span class="num"><pre>191</pre></span><pre> Time in seconds to cache this template with this ``cache_key``</pre></div>
<div class="cov"><span class="num"><pre>192</pre></span><pre> for. Or use 'never' to designate that the cache should never</pre></div>
<div class="cov"><span class="num"><pre>193</pre></span><pre> expire.</pre></div>
<div class="skip"><span class="num"><pre>194</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre>195</pre></span><pre> The minimum key required to trigger caching is</pre></div>
<div class="cov"><span class="num"><pre>196</pre></span><pre> ``cache_expire='never'`` which will cache the template forever</pre></div>
<div class="cov"><span class="num"><pre>197</pre></span><pre> seconds with no key.</pre></div>
<div class="skip"><span class="num"><pre>198</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre>199</pre></span><pre> """</pre></div>
<div class="skip"><span class="num"><pre>200</pre></span><pre> # If one of them is not None then the user did set something</pre></div>
<div class="nocov"><span class="num"><pre>201</pre></span><pre> if cache_key is not None or cache_expire is not None or cache_type \</pre></div>
<div class="nocov"><span class="num"><pre>202</pre></span><pre> is not None:</pre></div>
<div class="skip"><span class="num"><pre>203</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre>204</pre></span><pre> if not cache_type:</pre></div>
<div class="nocov"><span class="num"><pre>205</pre></span><pre> cache_type = 'dbm'</pre></div>
<div class="nocov"><span class="num"><pre>206</pre></span><pre> if not cache_key:</pre></div>
<div class="nocov"><span class="num"><pre>207</pre></span><pre> cache_key = 'default' </pre></div>
<div class="nocov"><span class="num"><pre>208</pre></span><pre> if cache_expire == 'never':</pre></div>
<div class="nocov"><span class="num"><pre>209</pre></span><pre> cache_expire = None</pre></div>
<div class="nocov"><span class="num"><pre>210</pre></span><pre> namespace = template_name</pre></div>
<div class="nocov"><span class="num"><pre>211</pre></span><pre> for name in ns_options:</pre></div>
<div class="nocov"><span class="num"><pre>212</pre></span><pre> namespace += str(kwargs.get(name))</pre></div>
<div class="nocov"><span class="num"><pre>213</pre></span><pre> cache = pylons.cache.get_cache(namespace, type=cache_type)</pre></div>
<div class="nocov"><span class="num"><pre>214</pre></span><pre> content = cache.get_value(cache_key, createfunc=render_func, </pre></div>
<div class="nocov"><span class="num"><pre>215</pre></span><pre> expiretime=cache_expire)</pre></div>
<div class="nocov"><span class="num"><pre>216</pre></span><pre> return content</pre></div>
<div class="nocov"><span class="num"><pre>217</pre></span><pre> else:</pre></div>
<div class="nocov"><span class="num"><pre>218</pre></span><pre> return render_func()</pre></div>
<div class="skip"><span class="num"><pre>219</pre></span><pre></pre></div>
<div class="skip"><span class="num"><pre>220</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>221</pre></span><pre>def render_mako(template_name, extra_vars=None, cache_key=None, </pre></div>
<div class="cov"><span class="num"><pre>222</pre></span><pre> cache_type=None, cache_expire=None):</pre></div>
<div class="cov"><span class="num"><pre>223</pre></span><pre> """Render a template with Mako</pre></div>
<div class="skip"><span class="num"><pre>224</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre>225</pre></span><pre> Accepts the cache options ``cache_key``, ``cache_type``, and</pre></div>
<div class="cov"><span class="num"><pre>226</pre></span><pre> ``cache_expire``.</pre></div>
<div class="skip"><span class="num"><pre>227</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre>228</pre></span><pre> """ </pre></div>
<div class="skip"><span class="num"><pre>229</pre></span><pre> # Create a render callable for the cache function</pre></div>
<div class="nocov"><span class="num"><pre>230</pre></span><pre> def render_template():</pre></div>
<div class="skip"><span class="num"><pre>231</pre></span><pre> # Pull in extra vars if needed</pre></div>
<div class="nocov"><span class="num"><pre>232</pre></span><pre> globs = extra_vars or {}</pre></div>
<div class="skip"><span class="num"><pre>233</pre></span><pre> </pre></div>
<div class="skip"><span class="num"><pre>234</pre></span><pre> # Second, get the globals</pre></div>
<div class="nocov"><span class="num"><pre>235</pre></span><pre> globs.update(pylons_globals())</pre></div>
<div class="skip"><span class="num"><pre>236</pre></span><pre></pre></div>
<div class="skip"><span class="num"><pre>237</pre></span><pre> # Grab a template reference</pre></div>
<div class="nocov"><span class="num"><pre>238</pre></span><pre> template = globs['app_globals'].mako_lookup.get_template(template_name)</pre></div>
<div class="skip"><span class="num"><pre>239</pre></span><pre> </pre></div>
<div class="nocov"><span class="num"><pre>240</pre></span><pre> return literal(template.render_unicode(**globs))</pre></div>
<div class="skip"><span class="num"><pre>241</pre></span><pre> </pre></div>
<div class="nocov"><span class="num"><pre>242</pre></span><pre> return cached_template(template_name, render_template, cache_key=cache_key,</pre></div>
<div class="nocov"><span class="num"><pre>243</pre></span><pre> cache_type=cache_type, cache_expire=cache_expire)</pre></div>
<div class="skip"><span class="num"><pre>244</pre></span><pre></pre></div>
<div class="skip"><span class="num"><pre>245</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>246</pre></span><pre>def render_mako_def(template_name, def_name, cache_key=None,</pre></div>
<div class="cov"><span class="num"><pre>247</pre></span><pre> cache_type=None, cache_expire=None, **kwargs):</pre></div>
<div class="cov"><span class="num"><pre>248</pre></span><pre> """Render a def block within a Mako template</pre></div>
<div class="skip"><span class="num"><pre>249</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre>250</pre></span><pre> Takes the template name, and the name of the def within it to call.</pre></div>
<div class="cov"><span class="num"><pre>251</pre></span><pre> If the def takes arguments, they should be passed in as keyword</pre></div>
<div class="cov"><span class="num"><pre>252</pre></span><pre> arguments.</pre></div>
<div class="skip"><span class="num"><pre>253</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre>254</pre></span><pre> Example::</pre></div>
<div class="skip"><span class="num"><pre>255</pre></span><pre> </pre></div>
<div class="skip"><span class="num"><pre>256</pre></span><pre> # To call the def 'header' within the 'layout.mako' template</pre></div>
<div class="skip"><span class="num"><pre>257</pre></span><pre> # with a title argument</pre></div>
<div class="cov"><span class="num"><pre>258</pre></span><pre> render_mako_def('layout.mako', 'header', title='Testing')</pre></div>
<div class="skip"><span class="num"><pre>259</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre>260</pre></span><pre> Also accepts the cache options ``cache_key``, ``cache_type``, and</pre></div>
<div class="cov"><span class="num"><pre>261</pre></span><pre> ``cache_expire``.</pre></div>
<div class="skip"><span class="num"><pre>262</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre>263</pre></span><pre> """</pre></div>
<div class="skip"><span class="num"><pre>264</pre></span><pre> # Create a render callable for the cache function</pre></div>
<div class="nocov"><span class="num"><pre>265</pre></span><pre> def render_template():</pre></div>
<div class="skip"><span class="num"><pre>266</pre></span><pre> # Pull in extra vars if needed</pre></div>
<div class="nocov"><span class="num"><pre>267</pre></span><pre> globs = kwargs or {}</pre></div>
<div class="skip"><span class="num"><pre>268</pre></span><pre> </pre></div>
<div class="skip"><span class="num"><pre>269</pre></span><pre> # Second, get the globals</pre></div>
<div class="nocov"><span class="num"><pre>270</pre></span><pre> globs.update(pylons_globals())</pre></div>
<div class="skip"><span class="num"><pre>271</pre></span><pre></pre></div>
<div class="skip"><span class="num"><pre>272</pre></span><pre> # Grab a template reference</pre></div>
<div class="nocov"><span class="num"><pre>273</pre></span><pre> template = globs['app_globals'].mako_lookup.get_template(</pre></div>
<div class="nocov"><span class="num"><pre>274</pre></span><pre> template_name).get_def(def_name)</pre></div>
<div class="skip"><span class="num"><pre>275</pre></span><pre> </pre></div>
<div class="nocov"><span class="num"><pre>276</pre></span><pre> return literal(template.render_unicode(**globs))</pre></div>
<div class="skip"><span class="num"><pre>277</pre></span><pre> </pre></div>
<div class="nocov"><span class="num"><pre>278</pre></span><pre> return cached_template(template_name, render_template, cache_key=cache_key,</pre></div>
<div class="nocov"><span class="num"><pre>279</pre></span><pre> cache_type=cache_type, cache_expire=cache_expire)</pre></div>
<div class="skip"><span class="num"><pre>280</pre></span><pre></pre></div>
<div class="skip"><span class="num"><pre>281</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>282</pre></span><pre>def render_genshi(template_name, extra_vars=None, cache_key=None, </pre></div>
<div class="cov"><span class="num"><pre>283</pre></span><pre> cache_type=None, cache_expire=None, method='xhtml'):</pre></div>
<div class="cov"><span class="num"><pre>284</pre></span><pre> """Render a template with Genshi</pre></div>
<div class="skip"><span class="num"><pre>285</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre>286</pre></span><pre> Accepts the cache options ``cache_key``, ``cache_type``, and</pre></div>
<div class="cov"><span class="num"><pre>287</pre></span><pre> ``cache_expire`` in addition to method which are passed to Genshi's</pre></div>
<div class="cov"><span class="num"><pre>288</pre></span><pre> render function.</pre></div>
<div class="skip"><span class="num"><pre>289</pre></span><pre> </pre></div>
<div class="cov"><span class="num"><pre>290</pre></span><pre> """</pre></div>
<div class="skip"><span class="num"><pre>291</pre></span><pre> # Create a render callable for the cache function</pre></div>
<div class="nocov"><span class="num"><pre>292</pre></span><pre> def render_template():</pre></div>
<div class="skip"><span class="num"><pre>293</pre></span><pre> # Pull in extra vars if needed</pre></div>
<div class="nocov"><span class="num"><pre>294</pre></span><pre> globs = extra_vars or {}</pre></div>
<div class="skip"><span class="num"><pre>295</pre></span><pre> </pre></div>
<div class="skip"><span class="num"><pre>296</pre></span><pre> # Second, get the globals</pre></div>
<div class="nocov"><span class="num"><pre>297</pre></span><pre> globs.update(pylons_globals())</pre></div>
<div class="skip"><span class="num"><pre>298</pre></span><pre></pre></div>
<div class="skip"><span class="num"><pre>299</pre></span><pre> # Grab a template reference</pre></div>
<div class="nocov"><span class="num"><pre>300</pre></span><pre> template = globs['app_globals'].genshi_loader.load(template_name)</pre></div>
<div class="skip"><span class="num"><pre>301</pre></span><pre> </pre></div>
<div class="nocov"><span class="num"><pre>302</pre></span><pre> return literal(template.generate(**globs).render(method=method,</pre></div>
<div class="nocov"><span class="num"><pre>303</pre></span><pre> encoding=None))</pre></div>
<div class="skip"><span class="num"><pre>304</pre></span><pre> </pre></div>
<div class="nocov"><span class="num"><pre>305</pre></span><pre> return cached_template(template_name, render_template, cache_key=cache_key,</pre></div>
<div class="nocov"><span class="num"><pre>306</pre></span><pre> cache_type=cache_type, cache_expire=cache_expire,</pre></div>
<div class="nocov"><span class="num"><pre>307</pre></span><pre> ns_options=('method'), method=method)</pre></div>
<div class="skip"><span class="num"><pre>308</pre></span><pre></pre></div>
<div class="skip"><span class="num"><pre>309</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>310</pre></span><pre>def render_jinja2(template_name, extra_vars=None, cache_key=None, </pre></div>
<div class="cov"><span class="num"><pre>311</pre></span><pre> cache_type=None, cache_expire=None):</pre></div>
<div class="cov"><span class="num"><pre>312</pre></span><pre> """Render a template with Jinja2</pre></div>
<div class="skip"><span class="num"><pre>313</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>314</pre></span><pre> Accepts the cache options ``cache_key``, ``cache_type``, and</pre></div>
<div class="cov"><span class="num"><pre>315</pre></span><pre> ``cache_expire``.</pre></div>
<div class="skip"><span class="num"><pre>316</pre></span><pre></pre></div>
<div class="cov"><span class="num"><pre>317</pre></span><pre> """ </pre></div>
<div class="skip"><span class="num"><pre>318</pre></span><pre> # Create a render callable for the cache function</pre></div>
<div class="nocov"><span class="num"><pre>319</pre></span><pre> def render_template():</pre></div>
<div class="skip"><span class="num"><pre>320</pre></span><pre> # Pull in extra vars if needed</pre></div>
<div class="nocov"><span class="num"><pre>321</pre></span><pre> globs = extra_vars or {}</pre></div>
<div class="skip"><span class="num"><pre>322</pre></span><pre> </pre></div>
<div class="skip"><span class="num"><pre>323</pre></span><pre> # Second, get the globals</pre></div>
<div class="nocov"><span class="num"><pre>324</pre></span><pre> globs.update(pylons_globals())</pre></div>
<div class="skip"><span class="num"><pre>325</pre></span><pre></pre></div>
<div class="skip"><span class="num"><pre>326</pre></span><pre> # Grab a template reference</pre></div>
<div class="nocov"><span class="num"><pre>327</pre></span><pre> template = \</pre></div>
<div class="nocov"><span class="num"><pre>328</pre></span><pre> globs['app_globals'].jinja2_env.get_template(template_name)</pre></div>
<div class="skip"><span class="num"><pre>329</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre>330</pre></span><pre> return literal(template.render(**globs))</pre></div>
<div class="skip"><span class="num"><pre>331</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre>332</pre></span><pre> return cached_template(template_name, render_template, cache_key=cache_key,</pre></div>
<div class="nocov"><span class="num"><pre>333</pre></span><pre> cache_type=cache_type, cache_expire=cache_expire)</pre></div>
<div class="skip"><span class="num"><pre>334</pre></span><pre></pre></div>
</div>
</body>
</html>
|