Slide 1

Slide 1 text

by Ivan Teoh Python Web Templating Battle

Slide 2

Slide 2 text

● Introduction ● 5 Web Templates ○ Features ○ Template Syntax ○ Template Loader ● Summary Content

Slide 3

Slide 3 text

PretaWeb specialises in the provision and support of high availability, dedicated and SaaS CMS solutions for government Pretaweb

Slide 4

Slide 4 text

The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way. Disclaimer

Slide 5

Slide 5 text

Web Template A web template is a tool used to separate content from presentation in web design. It is a basic component of a web template system. A Web template system describes the software and methodologies used to produce web pages. Such systems process web templates, using a template engine. - Wikipedia

Slide 6

Slide 6 text

Templates ● Django Template Language (http://www. djangoproject.com/) ● Chameleon (http://chameleon.repoze.org/) ● Jinja2 (http://jinja.pocoo.org/) ● Diazo and XSLT (http://docs.diazo.org/) ● Mako (http://www.makotemplates.org/)

Slide 7

Slide 7 text

Django Template Language ● text based template language ● define variables and basic control logic ● used in Django web framework ● custom tag and filter in Python code

Slide 8

Slide 8 text

Django - Template Syntax {% extends "base_generic.html" %} {% block title %}{{ section.title }}{% endblock %} {% block content %}

{{ section.title }}

{% for story in story_list %}

{{ story.headline|upper }}

{{ story.tease|truncatewords:"100" }}

{% endfor %} {% endblock %}

Slide 9

Slide 9 text

Django - Custom Filter def lower(value): # Only one argument. """Converts a string into all lowercase""" return value.lower() register.filter('lower', lower) {{ somevariable|lower }}

Slide 10

Slide 10 text

Django - Template loader from django.template import Context, Template t = Template("My name is {{ my_name }}.") c = Context({"my_name": "Ivan"}) t.render(c) def some_view(request): # ... return render_to_response('my_template.html', my_data_dictionary, context_instance=RequestContext(request))

Slide 11

Slide 11 text

Chameleon ● HTML/XML template engine ● compiles into Python bytecode ● the language used is page templates, originally a Zope invention ● uses Python as the default expression language ● used by Pyramid, Zope, Plone and Grok projects

Slide 12

Slide 12 text

Chameleon - Template Syntax

Even

Odd

  • odd
  • even

Slide 13

Slide 13 text

Chameleon - Attribute Language

...

Slide 14

Slide 14 text

Chameleon - Namespace Prefixes ... ...

Slide 15

Slide 15 text

Chameleon - Switch and case
  • odd
  • even

Slide 16

Slide 16 text

Chameleon - Repeat

Even

Odd

Slide 17

Slide 17 text

Chameleon - Expression Type
….

Slide 18

Slide 18 text

Chameleon - Embedded Python Code

Slide 19

Slide 19 text

Chameleon - Comment statement

Slide 20

Slide 20 text

Chameleon - Extension import ast def uppercase_expression(string): def compiler(target, engine): uppercased = self.string. uppercase() value = ast.Str(uppercased) return [ast.Assign(targets= [target], value=value)] return compiler from chameleon import PageTemplate PageTemplate.expression_types ['upper'] = uppercase_expression

Slide 21

Slide 21 text

Chameleon - Template loader import os path = os.path.dirname(__file__) from chameleon import PageTemplateLoader templates = PageTemplateLoader(os.path.join(path, "templates")) template = templates['hello.pt'] >>> template(name='John') '
Hello, John.
'

Slide 22

Slide 22 text

Jinja2 ● function/macros ● text based template language ● compiles down to the python bytecode ● heavily inspired by Django and Python ● general purpose template language

Slide 23

Slide 23 text

Jinja2 - Template Syntax My Webpage
    {% for user in users if not user.hidden %}
  • {{ user.username|e }}
  • {% endfor %}
{# this is comment #}

My Webpage

{{ my_variable }}

Slide 24

Slide 24 text

Jinja2 - Variables {{ my_variable }}

Slide 25

Slide 25 text

Jinja2 - Filters {{ user.username|e }}

Slide 26

Slide 26 text

Jinja2 - Comments {# this is comment #}

Slide 27

Slide 27 text

Jinja2 - Control Structures {% for user in users if not user.hidden %}
  • {{ user.username|e }}
  • {% endfor %}

    Slide 28

    Slide 28 text

    Jinja2 - Call {% macro render_dialog(title, class=’dialog’) -%}

    {{ title }}

    {{ caller() }}
    {%- endmacro %} {% call render_dialog(’Hello World’) %} This is a simple dialog rendered by using a macro and a call block. {% endcall %}

    Slide 29

    Slide 29 text

    Jinja2 - Template Loader from jinja2 import Environment, PackageLoader env = Environment(loader=PackageLoader('yourapplication', 'templates')) template = env.get_template('mytemplate.html') print template.render(the='variables', go='here')

    Slide 30

    Slide 30 text

    Diazo and XSLT

    Slide 31

    Slide 31 text

    Diazo - theme.html My own Diazo

    My own Diazo home page

    Lorem ipsum ...

    Slide 32

    Slide 32 text

    Diazo - rules.xml

    Slide 33

    Slide 33 text

    Diazo - Directives

    Slide 34

    Slide 34 text

    Diazo and XSLT

    Slide 35

    Slide 35 text

    Diazo - Compilation $ bin/diazocompiler -o theme.xsl -r rules.xml

    Slide 36

    Slide 36 text

    Diazo - Test Run $ bin/diazorun -o output.html -r rules.xml content.html

    Slide 37

    Slide 37 text

    Diazo - Template Loader

    Slide 38

    Slide 38 text

    Mako ● is an embedded Python (i.e. Python Server Page) language ● text based template language ● compiles down to the python byte-code ● function/macros ● control structures constructed from real Python code (i. e. loops, conditionals) ● straight Python blocks, inline or at the module-level

    Slide 39

    Slide 39 text

    Mako - Template Syntax <%inherit file="base.html"/> <% rows = [[v for v in range(0,10)] for row in range(0,10)] %> % for row in rows: ${makerow(row)} % endfor ## this is a comment. <%def name="makerow(row)"> % for name in row: ${name} % endfor

    Slide 40

    Slide 40 text

    Mako - Module-level Blocks <%! import mylib import re def filter(text): return re.sub(r'^@', '', text) %>

    Slide 41

    Slide 41 text

    Mako - Template Loader from mako.template import Template mytemplate = Template(filename='/docs/mytmpl.txt') print mytemplate.render() from mako.template import Template mytemplate = Template(filename='/docs/mytmpl.txt', module_directory='/tmp/mako_modules') print mytemplate.render()

    Slide 42

    Slide 42 text

    Summary

    Slide 43

    Slide 43 text

    Discussion / Q & A @ivanteoh http://www.pretaweb.com

    Slide 44

    Slide 44 text

    Thank You