2014-10-28 4 views
0

CherryPy와 Mako 템플릿 엔진을 사용하여 서버를 설정해야하지만, 작동시킬 수는 없습니다.CherryPy에서 Mako 엔진을 작동시킬 수 없습니다.

>>here<< 코드를 제 작업 CherryPy 설정에 통합하기 시작했습니다. 결국, "Hello, $ {username}!"만 볼 수 있습니다. 삽입 된 변수 대신 텍스트로. 검색이나 Google을 통해 찾은 다른 정보 또는 예도이를 해결하지 못했습니다.

코드가 상당히 길기 때문에 pastebin을 사용하여 표시합니다.

app/application.py < <

server.py

는 내가 거기 색인 모듈의 다른 버전을 추가하는 듯했으나 나는 또한 위의 링크 된 통합 예제에 그것을 시도했다.

<html> 
<body> 
Hello, ${username}! 
</body> 
</html> 

내가 설치를 잘하지 않았다 있나요 :

내용/index.html을

이 간단한 파일입니다?

+0

_ "제 작업 CherryPy 설정으로"_ - 작동하는'CherryPy' 설정은 무엇입니까? –

+0

글쎄, 나는 그것에 작동하도록 내 HTML 파일과 파이썬 스크립트를 얻을 수 있습니다. CherryPy 설정을 로컬 서버로 사용합니다. 내가 관련 있다고 생각하는 파일을 업로드하고 공유했습니다. – iBaer

+0

이 [질문] (http://stackoverflow.com/q/24578794/2072035)에서 Jinja2 및 Cheetah 용 CherryPy 도구를 찾을 수 있습니다. Mako의 기본 사항을 알고 있다면 그에 따라 템플릿 엔진 객체와 호출을 변경할 수 있어야합니다. – saaj

답변

0

내가 코멘트에 제시 한 내용은 실제로 템플릿 엔진 인스턴스를 변경 한 것입니다. 나머지는 같습니다. 템플릿 루틴을 처리 할 CherryPy 도구가 있으면 매우 편리하며 구성시 큰 유연성을 제공합니다.

  • 데코레이터는 템플릿 파일 이름에 대한 규칙 오버 구성을 사용 :이 도구에 대한

    <!DOCTYPE html> 
    <html> 
        <head> 
        <meta http-equiv='content-type' content='text/html; charset=utf-8' /> 
        <title>Test</title> 
        </head> 
        <body> 
        <p>Foo is: <em>${foo}</em></p> 
        </body> 
    </html> 
    

    주 : 스크립트 함께

    #!/usr/bin/env python 
    # -*- coding: utf-8 -*- 
    
    
    import os 
    import types 
    
    import cherrypy 
    import mako.lookup 
    
    
    path = os.path.abspath(os.path.dirname(__file__)) 
    config = { 
        'global' : { 
        'server.socket_host' : '127.0.0.1', 
        'server.socket_port' : 8080, 
        'server.thread_pool' : 8 
        } 
    } 
    
    
    class TemplateTool(cherrypy.Tool): 
    
        _engine = None 
        '''Mako lookup instance''' 
    
    
        def __init__(self): 
        viewPath  = os.path.join(path, 'view') 
        self._engine = mako.lookup.TemplateLookup(directories = [viewPath]) 
    
        cherrypy.Tool.__init__(self, 'before_handler', self.render) 
    
        def __call__(self, *args, **kwargs): 
        if args and isinstance(args[0], (types.FunctionType, types.MethodType)): 
         # @template 
         args[0].exposed = True 
         return cherrypy.Tool.__call__(self, **kwargs)(args[0]) 
        else: 
         # @template() 
         def wrap(f): 
         f.exposed = True 
         return cherrypy.Tool.__call__(self, *args, **kwargs)(f) 
         return wrap 
    
        def render(self, name = None): 
        cherrypy.request.config['template'] = name 
    
        handler = cherrypy.serving.request.handler 
        def wrap(*args, **kwargs): 
         return self._render(handler, *args, **kwargs) 
        cherrypy.serving.request.handler = wrap 
    
        def _render(self, handler, *args, **kwargs): 
        template = cherrypy.request.config['template'] 
        if not template: 
         parts = [] 
         if hasattr(handler.callable, '__self__'): 
         parts.append(handler.callable.__self__.__class__.__name__.lower()) 
         if hasattr(handler.callable, '__name__'): 
         parts.append(handler.callable.__name__.lower()) 
         template = '/'.join(parts) 
    
        data  = handler(*args, **kwargs) or {} 
        renderer = self._engine.get_template('{0}.html'.format(template)) 
    
        return renderer.render(**data) 
    
    
    cherrypy.tools.template = TemplateTool() 
    
    
    class App: 
    
        @cherrypy.tools.template 
        def index(self): 
        return {'foo': 'bar'} 
    
        @cherrypy.tools.template(name = 'app/index') 
        def manual(self): 
        return {'foo': 'baz'} 
    
        @cherrypy.tools.json_out() 
        @cherrypy.expose 
        def offtopic(self): 
        '''So it is a general way to apply a format to your data''' 
        return {'foo': 'quz'} 
    
    
    if __name__ == '__main__': 
        cherrypy.quickstart(App(), '/', config) 
    

    디렉토리 트리 view/app, 거기 index.html을 만들 만들 . classname/methodname.html입니다. 경우에 따라 name 키워드 꾸미기 인자로 템플릿을 재정의하고자 할 수 있습니다.
  • 데코레이터는 메서드 자체를 노출하므로 장식 할 필요가 없습니다. cherrypy.expose,
  • 이 도구는 구성에서 다른 CherryPy 도구처럼 사용할 수 있습니다. /app/some/path에있는 모든 메소드를 사용하여 해당 템플리트로 데이터를 렌더링하십시오.