ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Bottle] 4. Template
    Python/Bottle 2019. 9. 3. 12:17
    반응형

    [Python web framework: Bottle] 4. Template

    Bottle에는 'SimpleTemplate Engine' 이라는 내장 템플릿 엔진이 있고, template() 함수나 view() 데코레이터를 통해 사용할 수 있습니다. 

    from bottle import route, template, run
    
    
    @route('/')
    @route('/hello/<name>')
    def greet(name='Stranger'):
        return template('Hello {{name}}, how are you?', name=name)  # 1
    
    
    run(host='localhost', port=8080, debug=True)
    

    #1 에 template 함수와 {{name}} 이 보이시죠? 

     

    이렇게 데코레이터를 이용해서 사용할 수도 있습니다. 

    from bottle import route, view, run
    
    @route('/test')
    @view('{{test}}')
    def test():
        return dict(test='test 중')
    
    
    run(host='localhost', port=8080, debug=True)

     

    템플릿 엔진은 {{키}} 로 묶인 문자열을 뒤에 있는 딕셔너리의 키, 값을 이용해서 대치합니다. 

    >>> from bottle import template
    >>> template('Hello, {{name}}', name='Mike')
    'Hello, Mike'
    >>> template('Hello, {{name}}', {'name': 'Mike'})
    'Hello, Mike'
    >>> template('Hello, {{name}}', dict(name='Mike'))
    'Hello, Mike'
    >>> template('Hello, {{name1}}, {{name2}}', name1='Mike', name2='Kim')
    'Hello, Mike, Kim'
    >>> names = dict(name1='Mike', name2='Kim')
    >>> template('Hello, {{name1}}, {{name2}}', names)
    'Hello, Mike, Kim'

    % 또는 <%를 이용해서 간단한 제어문도 넣을 수 있습니다. 

    들여쓰기가 무시되며, 제어문의 끝은 end 입니다. 

    % 또는 <%은  공백 이후의 첫 문자여야 합니다. 

    from bottle import route, template, run
    
    
    @route('/')
    @route('/hello/<name>')
    def greet(name='Stranger'):
        return template(
            """
            %if name == 'World':
                <h1>Hello {{name}}!</h1>
                <p>This is a test.</p>
            %else:
                <h1>Hello {{name.title()}}!</h1>
                <p>How are you?</p>
            %end
            """, name=name)  # 1
    
    
    run(host='localhost', port=8080, debug=True)

    {{}} 안에도 인라인 제어문을 사용할 수 있습니다. 

    >>> template('Hello {{name}}!', name='World')
    'Hello World!'
    >>> template('Hello {{name.title() if name else "stranger"}}!', name=None)
    'Hello stranger!'
    >>> template('Hello {{name.title() if name else "stranger"}}!', name='mArC')
    'Hello Marc!'

    템플릿은 메모리에 캐쉬됩니다. 캐쉬를 지울 때는 bottle.TEMPLATES.clear() 을 하시면 됩니다. 

    디버그 모드에서는 캐쉬가 작동되지 않습니다. 

     

    다른 템플릿 파일을 불러오는 include, 현재 템플릿 파일을 다른 파일에 포함시켜주는 rebase 등의 함수도 있습니다. 

    include(sub_template, **variables)
    % include('header.tpl', title='Page Title')
    Page Content
    % include('footer.tpl')
    rebase(name, **variables)
    % rebase('base.tpl', title='Page Title')
    <p>Page Content ...</p>

    base.tpl의 예

    <html>
    <head>
      <title>{{title or 'No title'}}</title>
    </head>
    <body>
      {{!base}}
    </body>
    </html>

     

    Bottle은 './'와 './views/' 디렉토리를 템플릿을 위한 기본 폴더로 사용합니다. 그런데 a mod_python 과 mod_wsgi 환경에서 (./)디렉토리가 Apache의 설정에 따라 바뀌는 경우가 발생합니다. 그럴 때는 절대경로를 지정해 주면 됩니다. 

    bottle.TEMPLATE_PATH.insert(0,'/absolut/path/to/templates/')


    기타 더 자세한 문법은 아래 링크를 참고하시기 바랍니다. 

    https://bottlepy.org/docs/dev/stpl.html#simpletemplate-syntax

    반응형
Designed by Tistory.