-
[Bottle] 4. TemplatePython/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
반응형