2010-06-02 5 views
4

Возможно ли, если кто-нибудь поможет мне начать писать механизм шаблонов python? Я новичок в python, и, изучая язык, мне удалось написать небольшую инфраструктуру MVC, запущенную на своем собственном легком WSGI-сервере.Python template engine

мне удалось написать сценарий, который находит и заменяет ключи для значений: (. Очевидно, что это не так, как мой сценарий структурирован и реализован, это всего лишь пример)

from string import Template 

html = '<html>\n' 
html += ' <head>\n' 
html += ' <title>This is so Cool : In Controller HTML</title>\n' 
html += ' </head>\n' 
html += ' <body>\n' 
html += ' Home | <a href="/hi">Hi ${name}</a>\n' 
html += ' </body>\n' 
html += '<html>' 

Template(html).safe_substitute(dict(name = 'Arturo')) 

Моя следующая цель заключается в реализации пользовательских операторов, модификаторов, функций и т. д. (например, цикл «для»), но я не знаю, должен ли я использовать другой модуль, о котором я не знаю. Я думал о регулярных выражениях, но я вроде как бы не был эффективным способом сделать это

Любая помощь приветствуется, и я уверен, что это будет полезно и для других людей.

Спасибо

+0

Посмотрите на Django: http://code.djangoproject.com/. В частности, ознакомьтесь с ними: http://code.djangoproject.com/svn/django/trunk/django/template/. – Adam

+0

Я не хочу, чтобы это звучало грубо или что-то еще, но зачем писать свои собственные рамки, когда есть тонны уже написанных? Джанго - самый популярный, безусловно; Я бы рекомендовал проверить его, только бы посмотреть, как это работает. –

+0

@Adam Ссылка, которую вы опубликовали (вторая), велика, всегда приятно видеть, как великаны в теме. Время для меня сделать какое-то исследование – jturo

ответ

18

Есть много мощных языков шаблонов, поддерживаемых Python там. Я предпочитаю Jinja2. Также взгляните на Mako и Genshi.

Mako является самым быстрым среди трех, но его идеология позволяет иметь сложную логику кода прямо в шаблоне, что время от времени провоцирует нарушение принципов MVC.

У Genshi отличная концепция, особенно мощная функция - это наследование шаблона шаблона. Но он медленнее среди трех, и, как показывает практика, все его функции часто переполняются в реальном проекте.

Jinja2 - это золотая середина в моем личном мнении. Это легко расширяемый, довольно быстрый и знакомый для многих, поскольку он использует синтаксис, похожий на шаблоны Django и язык шаблона Liquid.

+0

+1 для Jinja2 !! – fabrizioM

+0

Спасибо nailxx. Сайт mako показывает это: Mako: 1.10ms Myghty: 4.52ms Cheetah: \t 1.10ms Genshi: 11.46ms Django: 2.74ms Kid: 14.54 мс, что круто, они потратили время на сравнение двигателей. Способность моего мозга сохранять информацию очень ограничена, поэтому я использую соглашения, чтобы помочь мне решить эту проблему. У меня все в порядке с логикой кода в шаблонах, если это не бизнес-логика (я не знаю, что вы имеете в виду, говоря «сложная логика кода») – jturo

1

Ну, когда я решаю поиграть, как и вы, TDD всегда хороший способ.

так, почему бы не отвести его?

, например, создать файл с именем jturo_template.py и написать:

import re 
import unittest 

class JTuroTemplate(object): 
    u"""JTuro's template engine core class""" 
    variable_regex = r'\$\{((.*)(%s)([^}]*))*\}' 
    def __init__(self, string): 
     self.string = string 

    def __repr__(self): 
     pieces = self.string.split() 
     if len(pieces) > 3: 
      head = "%s ..." % " ".join(pieces[:3]) 
     else: 
      head = " ".join(pieces) 

     return u'<JTuroTemplate: "%s">' % (head) 

    def render(self, context): 
     new = unicode(self.string) 

     for key, value in context.items(): 
      variable_name = re.escape(key) 
      regex = re.compile(self.variable_regex % variable_name) 

      for match in regex.findall(new): 
       if match[0]: 
        replacement = match[0].replace(key, repr(value)) 
        new = new.replace('${%s}' % match[0], unicode(eval(replacement))) 

     return new 

class TestJTuroTemplate(unittest.TestCase): 
    def test_repr(self): 
     "a instance will be nicely represented" 
     jt = JTuroTemplate('my template') 
     self.assertEquals(repr(jt), '<JTuroTemplate: "my template">') 

    def test_repr_truncated(self): 
     "the python representation is truncated after 3 words" 

     jt = JTuroTemplate('such a long string template') 
     self.assertEquals(repr(jt), '<JTuroTemplate: "such a long ...">') 

    def test_solves_simple_variables(self): 
     "it solves simple variables" 

     jt = JTuroTemplate('my variable is ${var} == 4') 
     self.assertEquals(jt.render({'var': '4'}), 'my variable is 4 == 4') 

    def test_solves_variables_with_python_code(self): 
     "it solves variables with python code" 

     jt = JTuroTemplate('my variable is ${var + var} == 44') 
     self.assertEquals(jt.render({'var': '4'}), 'my variable is 44 == 44') 

if __name__ == '__main__': 
    unittest.main() 

Извините за длинный пост, но я думаю, вы можете попробовать этот рабочий процесс:

  1. запись тест, который сбой
  2. запустить и смотреть его сбой
  3. написать код, чтобы сделать тест проходит
  4. запустить снова и смотреть его пройти
+0

спасибо за ваш код, это также потребует некоторых изучения. Я думал, что регулярные выражения - это один из способов, но большой вопрос: будет ли сайт с интенсивным трафиком работать очень медленно, используя механизм шаблонов, выполняющий множество регулярных выражений ?. Еще раз спасибо Габриэлю за сообщение – jturo

4

хорошо, как вы сказали, вы питон новичком, и единственная причина, вы сочинительство новый MVC рамки и механизм шаблонов с нуля, для целей обучения , вы не должны заботиться о производительности IMHO.

Но если вы решили поставить что-то в производство, вам следует рассмотреть возможность использования уже существующих движков шаблонов, таких как jinja2, mako, genshi и т. Д.

В любом случае, если вы хотите играть вокруг, есть хороший пример легких рамок веб-питона по адресу: http://github.com/breily/juno

и LightSpeed ​​шаблонизатора на http://github.com/eklitzke/spitfire

счастливой хакерским!

+0

Ну, я должен признать, что у вас там есть точка. Спасибо за ссылки и скрипт. Хорошие вещи, чтобы играть и учиться. – jturo