2010-06-02 3 views
4

누군가가 파이썬 템플릿 엔진을 작성하는 데 도움이 될 수 있습니까? 저는 파이썬에 익숙하지 않습니다. 언어를 배우면서 약간의 MVC 프레임 워크를 자체 가벼운 WSGI와 유사한 서버에서 작성했습니다.Python 템플릿 엔진

내가 찾아 값에 대한 키를 대체하는 스크립트를 작성하는 관리했습니다 : 를

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')) 

내 다음 목표 (. 분명히 이것은 내 스크립트 구성 또는 구현되지 방법입니다 이것은 단지 예입니다) ('for'루프와 같은) 커스텀 문장, 변경자, 함수 등을 구현하는 것이지만, 내가 알지 못하는 다른 모듈을 사용해야하는지 정말로 모르겠습니다. 나는 정규 표현식을 생각해 보았지만 그 일을 효율적으로 수행 할 수 없다는 느낌이 들었다.

도움이 되었기 때문에 다른 사람들에게도 유용 할 것으로 확신한다.

고맙습니다.

+0

Django : http://code.djangoproject.com/을 살펴보십시오. 특히 다음을 확인하십시오 : http://code.djangoproject.com/svn/django/trunk/django/template/. – Adam

+0

나는 이것을 무례하게 생각하거나 무언가를 말하고 싶지 않지만 이미 쓸 수있는 톤이 많을 때 왜 자신의 프레임 워크를 작성합니까? 장고는 가장 인기있는 장르이다. 나는 그것이 어떻게 작동 하는지를보기 위해서만 그것을 체크하는 것이 좋습니다. –

+0

@Adam 게시 한 링크 (두 번째 링크)는 훌륭합니다. 주제의 거인들이 어떻게하는지 항상 잘 알고 있습니다. 내가 약간의 연구를 할 시간. – jturo

답변

18

파이썬이 지원하는 많은 강력한 템플릿 언어가 있습니다. 나는 Jinja2을 선호한다. 또한 MakoGenshi을 살펴보십시오.

마코는 3 가지 중에서 가장 빠르지 만, 이데올로기는 템플릿에 복잡한 코드 논리를 사용하여 때때로 MVC 원칙 위반을 유발할 수 있습니다.

Genshi는 뛰어난 개념을 가지고 있으며, 특히 강력한 기능은 템플릿 상속을 거꾸로합니다. 그러나 3 가지 중에서 가장 느리며 실습이 실제 프로젝트에서 모든 기능을 과장하는 경우가 많습니다.

Jinja2는 제 개인적인 견해로 황금 중간입니다. Django 템플릿과 Liquid 템플릿 언어와 비슷한 구문을 사용하기 때문에 쉽게 확장 할 수 있으며, 매우 빠르고 익숙합니다.

+0

+1 Jinja2! – fabrizioM

+0

감사합니다. nailxx. Mako : 1.10ms Myghty : 4.52ms Cheetah : \t 1.10ms Genshi : 11.46ms Django : 2.74ms Kid : 14.54ms 그것은 엔진을 비교하는 데 시간이 걸렸습니다. 정보를 유지할 수있는 두뇌의 능력은 매우 제한적이므로 문제를 해결하는 데 협약을 사용합니다. 나는 코드 논리를 가지고있는 템플릿에서 비즈니스 로직이 아닌 한 (나는 "복잡한 코드 로직"이라고 말하면 무슨 뜻인지 알지 못한다.) – 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. 실행을 통과하고 당신이 파이썬 신인, 당신은 처음부터 새 MVC 프레임 워크와 템플릿 엔진을 writting하는 유일한 이유입니다 말했듯이, 잘
+0

코드에 대해 고마워한다. 공부하고있어. 나는 정규 표현식이 한 가지 방법이라고 생각했지만 큰 문제는 많은 트래픽을 가진 사이트가 많은 정규 표현식을 실행하는 템플릿 엔진을 사용하여 매우 느리게 느껴지겠습니까? 고마워요. 다시 게시판에 대한 가브리엘 – jturo

4

을 통과 시청 목적을 배우기위한 것입니다 , 당신은 IMHO 성능에 신경 쓰지 않아야합니다.

하지만 생산에 뭔가를 넣어하기로 결정한 경우, 당신은 이미 등등 jinja2, 청상 아리, genshi와 같은 존재 템플릿 엔진을 사용하는 것이 좋습니다.http://github.com/eklitzke/spitfire

행복 해킹에 http://github.com/breily/juno

및 광속 템플릿 엔진 : 당신이 주변에 재생하려면

는 어쨌든에서 경량 웹 파이썬 프레임 워크의 좋은 예있다!

+0

글쎄, 거기에 요점이 있다는 것을 인정해야 해. 링크와 스크립트에 감사드립니다. 놀고 배울 좋은 물건. – jturo