ݺߣ

ݺߣShare a Scribd company logo
Flask 스터디 – 템플릿
7/9/2013
템플릿이 뭐에요?
• 웹 개발에서 템플릿은 데이터를 덧씌울
HTML 파일을 지칭
• 웹 템플레이트 (Web Template)
???
• 웹 개발 간단 리뷰
• 일반적인 웹 서비스의 구조
– 클라이언트
– 웹 서버
– 웹 애플리케이션 (+ 데이터베이스)
플라스크 템플릿
플라스크 템플릿
플라스크 템플릿
클라이언트 -> 웹서버
• Flask가 제공하는 개발 전용 웹서버
– Apache 등을 설치할 필요 없이 개발 환경에서 간
단한 웹서버를 구동
– 클라이언트에서 받은 HTTP request 실시간 확인
– 실제 서비스 용도는 아님!
웹서버 -> 웹 애플리케이션
• 웹서버로 온 HTTP Request -> 웹앱 전달
• 웹 애플리케이션은 request에 대응해서,
– 데이터베이스에서 데이터를 가져온 후 가공
– 데이터를 HTML에 입힌 후 전송 (response)
• 데이터를 입히는 작업을 “렌더링” 혹은 “템플레이
팅”이라고 부름
• 이 작업을 하는 도구가 “템플릿 엔진”
Flask의 템플릿 엔진
• Jinja2
– Flask에 포함된 템플릿 엔진
– 하지만 Flask와 독립된 프로젝트
• Flask 프로젝트에서 Jinja2 아닌 다른 템플릿 엔진
사용 가능 (Genshi, Mako 등)
• 그러나 Flask의 플러그인 호환성을 위해 Jinja2는
기본적으로 설치 해야 됨
Jinja2 기본 Syntax
• 표현식은 {% … %}
• 변수는 {{ … }}
• 표현식은 파이썬과 비슷
– 예) team_list라는 리스트를 렌더링할때:
{% for team in team_list %}
{{ team }}
{% endfor %}
템플릿 렌더링 예제
템플릿 렌더링 예제
• 일반 HTML 페이지
• 데이터가 바뀔 때마다
HTML을 수정해야 됨
템플릿 렌더링 예제
• 템플릿화 된 HTML
• HTML이 아닌 템플릿 언
어로 프레젠테이션 로직
을 표현
• 템플릿 렌더링을 통해,
HTML 수정 없이 동적인
페이지를 제작
템플릿 렌더링 예제
렌더링된 페이지
템플릿 렌더링 예제
렌더링된 페이지
• HTML 수정 없음!
• “내용”과 “프레젠테이션”의 분리
– 내용은 서버에서 데이터를 가공
– 프레젠테이션 로직은 템플릿 언어로 표현
Jinja2 기본 Syntax
• 다음과 같은 표현도 가능:
– {{ foo.bar }}
– {{ foo[„bar‟] }}
• 예제 1)
– View에서 다음 dict object를 보내면,
var = { „name‟ : u‟플라스크‟, „date‟ : u‟7/9/2012‟ }
– 템플릿에서 {{ var.name }}이나 {{ var.date }}로
사용 가능
Jinja2 기본 Syntax
• 예제 2)
class Study():
name = u‟플라스크‟
my_study = Study()
• view에서 my_study를 넘겨준 후,
{{ my_study.name }}
Jinja2 기본 Syntax
• flow control:
{% if kenny.sick %}
Kenny is sick.
{% elif kenny.dead %}
You killed Kenny! You bastard!!!
{% else %}
Kenny looks okay --- so far
{% endif %}
Jinja2 기본 Syntax
• function:
{% for number in range(5) %}
<li class="empty"><span>...</span></li>
{% endfor %}
Jinja2 필터
• filter:
{{ name|capitalize }}
-> capitalize(name)과 같은 효과
• argument도 사용 가능
{{ "%s - %s"|format("Hello?", "Foo!") }}
-> “Hello? - Foo!”
Jinja2 필터
• 쉽게 custom filter를 등록해서 사용
• 예제:
from jinja2 import contextfilter
@contextfilter
def my_filter(context, value):
result = do_something(value)
return result
-> {{ name|my_filter }}
Jinja2 테스트
• 표현식 내에서 사용 가능한 간단한 테스트들
{% if loop.index is divisibleby(3) %}
• number(), string(), defined(), 등등…
• http://jinja.pocoo.org/docs/templates/#builtin-
tests
Jinja2 템플릿 상속
• 예제) hello.html의 header와 footer 부분을 base.html로
떼어내기
Jinja2 템플릿 상속
• 예제) hello.html의 header와 footer 부분을 base.html로
떼어내기
Jinja2 템플릿 상속
• 예제) hello.html의 header와 footer 부분을 base.html로
떼어내기
• 분리된 hello.html:
Jinja2 템플릿 상속
• 한 템플릿 안에 여러 {% block %} 생성 가능
• 예제)
Base.html:
<!doctype html>
<html>
{% block header %}{% endblock %}
{% block css %}{% endblock %}
{% block body %}{% endblock %}
{% block footer %}{% endblock %}
{% block javascript %}{% endblock %}
</html>
Jinja2 Autoescaping
• 경우에 따라, 렌더링하는 변수에 HTML이 포함되는 경우
가 있음:
description = <h1>Hello</h1>
{{ description }}
• 만일 적절한 처리가 되어 있지 않다면, 악성 스크립트가
렌더링되는 경우가 발생 -> 보안 위험 (XSS 공격)
• 따라서, HTML 특수 기호 <,> 등은 렌더링할때 HTML로
인식되지 않게 처리 -> “autoescape” (기본 설정 on)
Jinja2 Autoescaping
• 만일 HTML을 렌더링 하고 싶으면, autoescape
설정을 끄면 됨:
description = <h1>Hello!</h1>
{% autoescape false %}
{{ description }}
{% endautoescape %}
-> <h1>이 HTML 태그로 렌더링 됨
• 보안 위험 주의!
Jinja2의 모든 기능
• 다양한 Jinja2의 filter, built-in test들은 공식 문서
를 참고!
• http://jinja.pocoo.org/docs/templates/

More Related Content

What's hot (20)

Django in Production
Django in ProductionDjango in Production
Django in Production
Hyun-woo Park
휴봇-슬랙 OSX 설치
휴봇-슬랙 OSX 설치휴봇-슬랙 OSX 설치
휴봇-슬랙 OSX 설치
Juneyoung Oh
장고로 웹서비스 만들기 기초
장고로 웹서비스 만들기   기초장고로 웹서비스 만들기   기초
장고로 웹서비스 만들기 기초
Kwangyoun Jung
PHP로 Slack Bot 만들기
PHP로 Slack Bot 만들기PHP로 Slack Bot 만들기
PHP로 Slack Bot 만들기
Changwan Jun
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
Kwangyoun Jung
201803 파이썬 세미나
201803 파이썬 세미나201803 파이썬 세미나
201803 파이썬 세미나
JeongHwan Kim
QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기
QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기
QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기
Kwangyoun Jung
스프링 데이터 레디스 엘라스틱 발표자료
스프링 데이터 레디스 엘라스틱 발표자료스프링 데이터 레디스 엘라스틱 발표자료
스프링 데이터 레디스 엘라스틱 발표자료
라한사 아
쉽게 쓰여진 Django
쉽게 쓰여진 Django쉽게 쓰여진 Django
쉽게 쓰여진 Django
Taehoon Kim
Light Tutorial Django
Light Tutorial DjangoLight Tutorial Django
Light Tutorial Django
Kwangyoun Jung
처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1
성일 한
spring data jpa 간단한 튜토리얼
spring data jpa 간단한 튜토리얼spring data jpa 간단한 튜토리얼
spring data jpa 간단한 튜토리얼
라한사 아
동시성 프로그래밍 기초 in GO
동시성 프로그래밍 기초 in GO 동시성 프로그래밍 기초 in GO
동시성 프로그래밍 기초 in GO
라한사 아
아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리
라한사 아
스프링시큐리티와 소셜연습 이해를 위한 글
스프링시큐리티와 소셜연습 이해를 위한 글스프링시큐리티와 소셜연습 이해를 위한 글
스프링시큐리티와 소셜연습 이해를 위한 글
라한사 아
JavaSript Template Engine
JavaSript Template EngineJavaSript Template Engine
JavaSript Template Engine
Ohgyun Ahn
Golang 개발 환경(profile) 다르게 잡아주기
Golang 개발 환경(profile) 다르게 잡아주기Golang 개발 환경(profile) 다르게 잡아주기
Golang 개발 환경(profile) 다르게 잡아주기
라한사 아
Django admin site 커스텀하여 적극적으로 활용하기
Django admin site 커스텀하여 적극적으로 활용하기Django admin site 커스텀하여 적극적으로 활용하기
Django admin site 커스텀하여 적극적으로 활용하기
영우 박
스프링 REST DOCS 따라해보기
스프링 REST DOCS 따라해보기스프링 REST DOCS 따라해보기
스프링 REST DOCS 따라해보기
라한사 아
Python 으로 Slackbot 개발하기
Python 으로 Slackbot 개발하기Python 으로 Slackbot 개발하기
Python 으로 Slackbot 개발하기
성일 한
휴봇-슬랙 OSX 설치
휴봇-슬랙 OSX 설치휴봇-슬랙 OSX 설치
휴봇-슬랙 OSX 설치
Juneyoung Oh
장고로 웹서비스 만들기 기초
장고로 웹서비스 만들기   기초장고로 웹서비스 만들기   기초
장고로 웹서비스 만들기 기초
Kwangyoun Jung
PHP로 Slack Bot 만들기
PHP로 Slack Bot 만들기PHP로 Slack Bot 만들기
PHP로 Slack Bot 만들기
Changwan Jun
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
Kwangyoun Jung
201803 파이썬 세미나
201803 파이썬 세미나201803 파이썬 세미나
201803 파이썬 세미나
JeongHwan Kim
QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기
QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기
QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기
Kwangyoun Jung
스프링 데이터 레디스 엘라스틱 발표자료
스프링 데이터 레디스 엘라스틱 발표자료스프링 데이터 레디스 엘라스틱 발표자료
스프링 데이터 레디스 엘라스틱 발표자료
라한사 아
쉽게 쓰여진 Django
쉽게 쓰여진 Django쉽게 쓰여진 Django
쉽게 쓰여진 Django
Taehoon Kim
처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1
성일 한
spring data jpa 간단한 튜토리얼
spring data jpa 간단한 튜토리얼spring data jpa 간단한 튜토리얼
spring data jpa 간단한 튜토리얼
라한사 아
동시성 프로그래밍 기초 in GO
동시성 프로그래밍 기초 in GO 동시성 프로그래밍 기초 in GO
동시성 프로그래밍 기초 in GO
라한사 아
아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리
라한사 아
스프링시큐리티와 소셜연습 이해를 위한 글
스프링시큐리티와 소셜연습 이해를 위한 글스프링시큐리티와 소셜연습 이해를 위한 글
스프링시큐리티와 소셜연습 이해를 위한 글
라한사 아
JavaSript Template Engine
JavaSript Template EngineJavaSript Template Engine
JavaSript Template Engine
Ohgyun Ahn
Golang 개발 환경(profile) 다르게 잡아주기
Golang 개발 환경(profile) 다르게 잡아주기Golang 개발 환경(profile) 다르게 잡아주기
Golang 개발 환경(profile) 다르게 잡아주기
라한사 아
Django admin site 커스텀하여 적극적으로 활용하기
Django admin site 커스텀하여 적극적으로 활용하기Django admin site 커스텀하여 적극적으로 활용하기
Django admin site 커스텀하여 적극적으로 활용하기
영우 박
스프링 REST DOCS 따라해보기
스프링 REST DOCS 따라해보기스프링 REST DOCS 따라해보기
스프링 REST DOCS 따라해보기
라한사 아
Python 으로 Slackbot 개발하기
Python 으로 Slackbot 개발하기Python 으로 Slackbot 개발하기
Python 으로 Slackbot 개발하기
성일 한

Similar to 플라스크 템플릿 (20)

파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기
Yong Joon Moon
메이븐 기본 이해
메이븐 기본 이해메이븐 기본 이해
메이븐 기본 이해
중선 곽
엄준일 04일차 HTML/Javascript 교육
엄준일 04일차 HTML/Javascript 교육엄준일 04일차 HTML/Javascript 교육
엄준일 04일차 HTML/Javascript 교육
준일 엄
Hacosa jquery 1th
Hacosa jquery 1thHacosa jquery 1th
Hacosa jquery 1th
Seong Bong Ji
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XpressEngine
알아봅시다, Polymer: Web Components & Web Animations
알아봅시다, Polymer: Web Components & Web Animations알아봅시다, Polymer: Web Components & Web Animations
알아봅시다, Polymer: Web Components & Web Animations
Chang W. Doh
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Javajigi Jaesung
테스트 케이스와 SW 품질
테스트 케이스와 SW 품질테스트 케이스와 SW 품질
테스트 케이스와 SW 품질
도형 임
Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기
Inho Kwon
04.실행환경 교육교재(화면처리)
04.실행환경 교육교재(화면처리)04.실행환경 교육교재(화면처리)
04.실행환경 교육교재(화면처리)
Hankyo
집단지성 프로그래밍 04-검색과 랭킹-02
집단지성 프로그래밍 04-검색과 랭킹-02집단지성 프로그래밍 04-검색과 랭킹-02
집단지성 프로그래밍 04-검색과 랭킹-02
Kwang Woo NAM
소스리딩워크샵 - NHN NEXT
소스리딩워크샵 - NHN NEXT소스리딩워크샵 - NHN NEXT
소스리딩워크샵 - NHN NEXT
Minsuk Lee
FCGI, C++로 Restful 서버 개발
FCGI, C++로 Restful 서버 개발FCGI, C++로 Restful 서버 개발
FCGI, C++로 Restful 서버 개발
현승 배
정보검색과 Elasticsearch (크몽)
정보검색과 Elasticsearch (크몽)정보검색과 Elasticsearch (크몽)
정보검색과 Elasticsearch (크몽)
크몽
eclipse에서 intelliJ IDEA로
eclipse에서 intelliJ IDEA로eclipse에서 intelliJ IDEA로
eclipse에서 intelliJ IDEA로
Juntai Park
[Ansible] Solution Guide V0.4_20181204.pdf
[Ansible] Solution Guide V0.4_20181204.pdf[Ansible] Solution Guide V0.4_20181204.pdf
[Ansible] Solution Guide V0.4_20181204.pdf
HeeJung Chae
Java script 강의자료_ed13
Java script 강의자료_ed13Java script 강의자료_ed13
Java script 강의자료_ed13
hungrok
Java8 & Lambda
Java8 & LambdaJava8 & Lambda
Java8 & Lambda
기현 황
01.개발환경 교육교재
01.개발환경 교육교재01.개발환경 교육교재
01.개발환경 교육교재
Hankyo
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기
Yong Joon Moon
메이븐 기본 이해
메이븐 기본 이해메이븐 기본 이해
메이븐 기본 이해
중선 곽
엄준일 04일차 HTML/Javascript 교육
엄준일 04일차 HTML/Javascript 교육엄준일 04일차 HTML/Javascript 교육
엄준일 04일차 HTML/Javascript 교육
준일 엄
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XpressEngine
알아봅시다, Polymer: Web Components & Web Animations
알아봅시다, Polymer: Web Components & Web Animations알아봅시다, Polymer: Web Components & Web Animations
알아봅시다, Polymer: Web Components & Web Animations
Chang W. Doh
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Javajigi Jaesung
테스트 케이스와 SW 품질
테스트 케이스와 SW 품질테스트 케이스와 SW 품질
테스트 케이스와 SW 품질
도형 임
Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기
Inho Kwon
04.실행환경 교육교재(화면처리)
04.실행환경 교육교재(화면처리)04.실행환경 교육교재(화면처리)
04.실행환경 교육교재(화면처리)
Hankyo
집단지성 프로그래밍 04-검색과 랭킹-02
집단지성 프로그래밍 04-검색과 랭킹-02집단지성 프로그래밍 04-검색과 랭킹-02
집단지성 프로그래밍 04-검색과 랭킹-02
Kwang Woo NAM
소스리딩워크샵 - NHN NEXT
소스리딩워크샵 - NHN NEXT소스리딩워크샵 - NHN NEXT
소스리딩워크샵 - NHN NEXT
Minsuk Lee
FCGI, C++로 Restful 서버 개발
FCGI, C++로 Restful 서버 개발FCGI, C++로 Restful 서버 개발
FCGI, C++로 Restful 서버 개발
현승 배
정보검색과 Elasticsearch (크몽)
정보검색과 Elasticsearch (크몽)정보검색과 Elasticsearch (크몽)
정보검색과 Elasticsearch (크몽)
크몽
eclipse에서 intelliJ IDEA로
eclipse에서 intelliJ IDEA로eclipse에서 intelliJ IDEA로
eclipse에서 intelliJ IDEA로
Juntai Park
[Ansible] Solution Guide V0.4_20181204.pdf
[Ansible] Solution Guide V0.4_20181204.pdf[Ansible] Solution Guide V0.4_20181204.pdf
[Ansible] Solution Guide V0.4_20181204.pdf
HeeJung Chae
Java script 강의자료_ed13
Java script 강의자료_ed13Java script 강의자료_ed13
Java script 강의자료_ed13
hungrok
01.개발환경 교육교재
01.개발환경 교육교재01.개발환경 교육교재
01.개발환경 교육교재
Hankyo

플라스크 템플릿

  • 1. Flask 스터디 – 템플릿 7/9/2013
  • 2. 템플릿이 뭐에요? • 웹 개발에서 템플릿은 데이터를 덧씌울 HTML 파일을 지칭 • 웹 템플레이트 (Web Template)
  • 3. ??? • 웹 개발 간단 리뷰 • 일반적인 웹 서비스의 구조 – 클라이언트 – 웹 서버 – 웹 애플리케이션 (+ 데이터베이스)
  • 7. 클라이언트 -> 웹서버 • Flask가 제공하는 개발 전용 웹서버 – Apache 등을 설치할 필요 없이 개발 환경에서 간 단한 웹서버를 구동 – 클라이언트에서 받은 HTTP request 실시간 확인 – 실제 서비스 용도는 아님!
  • 8. 웹서버 -> 웹 애플리케이션 • 웹서버로 온 HTTP Request -> 웹앱 전달 • 웹 애플리케이션은 request에 대응해서, – 데이터베이스에서 데이터를 가져온 후 가공 – 데이터를 HTML에 입힌 후 전송 (response) • 데이터를 입히는 작업을 “렌더링” 혹은 “템플레이 팅”이라고 부름 • 이 작업을 하는 도구가 “템플릿 엔진”
  • 9. Flask의 템플릿 엔진 • Jinja2 – Flask에 포함된 템플릿 엔진 – 하지만 Flask와 독립된 프로젝트 • Flask 프로젝트에서 Jinja2 아닌 다른 템플릿 엔진 사용 가능 (Genshi, Mako 등) • 그러나 Flask의 플러그인 호환성을 위해 Jinja2는 기본적으로 설치 해야 됨
  • 10. Jinja2 기본 Syntax • 표현식은 {% … %} • 변수는 {{ … }} • 표현식은 파이썬과 비슷 – 예) team_list라는 리스트를 렌더링할때: {% for team in team_list %} {{ team }} {% endfor %}
  • 12. 템플릿 렌더링 예제 • 일반 HTML 페이지 • 데이터가 바뀔 때마다 HTML을 수정해야 됨
  • 13. 템플릿 렌더링 예제 • 템플릿화 된 HTML • HTML이 아닌 템플릿 언 어로 프레젠테이션 로직 을 표현 • 템플릿 렌더링을 통해, HTML 수정 없이 동적인 페이지를 제작
  • 17. 렌더링된 페이지 • HTML 수정 없음! • “내용”과 “프레젠테이션”의 분리 – 내용은 서버에서 데이터를 가공 – 프레젠테이션 로직은 템플릿 언어로 표현
  • 18. Jinja2 기본 Syntax • 다음과 같은 표현도 가능: – {{ foo.bar }} – {{ foo[„bar‟] }} • 예제 1) – View에서 다음 dict object를 보내면, var = { „name‟ : u‟플라스크‟, „date‟ : u‟7/9/2012‟ } – 템플릿에서 {{ var.name }}이나 {{ var.date }}로 사용 가능
  • 19. Jinja2 기본 Syntax • 예제 2) class Study(): name = u‟플라스크‟ my_study = Study() • view에서 my_study를 넘겨준 후, {{ my_study.name }}
  • 20. Jinja2 기본 Syntax • flow control: {% if kenny.sick %} Kenny is sick. {% elif kenny.dead %} You killed Kenny! You bastard!!! {% else %} Kenny looks okay --- so far {% endif %}
  • 21. Jinja2 기본 Syntax • function: {% for number in range(5) %} <li class="empty"><span>...</span></li> {% endfor %}
  • 22. Jinja2 필터 • filter: {{ name|capitalize }} -> capitalize(name)과 같은 효과 • argument도 사용 가능 {{ "%s - %s"|format("Hello?", "Foo!") }} -> “Hello? - Foo!”
  • 23. Jinja2 필터 • 쉽게 custom filter를 등록해서 사용 • 예제: from jinja2 import contextfilter @contextfilter def my_filter(context, value): result = do_something(value) return result -> {{ name|my_filter }}
  • 24. Jinja2 테스트 • 표현식 내에서 사용 가능한 간단한 테스트들 {% if loop.index is divisibleby(3) %} • number(), string(), defined(), 등등… • http://jinja.pocoo.org/docs/templates/#builtin- tests
  • 25. Jinja2 템플릿 상속 • 예제) hello.html의 header와 footer 부분을 base.html로 떼어내기
  • 26. Jinja2 템플릿 상속 • 예제) hello.html의 header와 footer 부분을 base.html로 떼어내기
  • 27. Jinja2 템플릿 상속 • 예제) hello.html의 header와 footer 부분을 base.html로 떼어내기 • 분리된 hello.html:
  • 28. Jinja2 템플릿 상속 • 한 템플릿 안에 여러 {% block %} 생성 가능 • 예제) Base.html: <!doctype html> <html> {% block header %}{% endblock %} {% block css %}{% endblock %} {% block body %}{% endblock %} {% block footer %}{% endblock %} {% block javascript %}{% endblock %} </html>
  • 29. Jinja2 Autoescaping • 경우에 따라, 렌더링하는 변수에 HTML이 포함되는 경우 가 있음: description = <h1>Hello</h1> {{ description }} • 만일 적절한 처리가 되어 있지 않다면, 악성 스크립트가 렌더링되는 경우가 발생 -> 보안 위험 (XSS 공격) • 따라서, HTML 특수 기호 <,> 등은 렌더링할때 HTML로 인식되지 않게 처리 -> “autoescape” (기본 설정 on)
  • 30. Jinja2 Autoescaping • 만일 HTML을 렌더링 하고 싶으면, autoescape 설정을 끄면 됨: description = <h1>Hello!</h1> {% autoescape false %} {{ description }} {% endautoescape %} -> <h1>이 HTML 태그로 렌더링 됨 • 보안 위험 주의!
  • 31. Jinja2의 모든 기능 • 다양한 Jinja2의 filter, built-in test들은 공식 문서 를 참고! • http://jinja.pocoo.org/docs/templates/