내용은 Ctr+F 로 찾자!
23.08.01 코드를 작성하던 중 문득 Jinja Templates 와 Django Templates 의 차이점이 궁금해졌다.
궁금해서 찾아봤고 정리를 위해 이 문서를 작성한다.
23.08.03 for 문 예제와 설명을 추가했다.
Jinja Template
jinja Template 는 Python 기반의 템플릿 언어로 마크 업 언어(ex.HTML...) 에서도 동적인 데이터를 표현할 수 있도록 돕는다.
즉, HTML 코드 내부에서 Python의 For, if 등의 함수와 변수를 사용할 수 있도록 돕는 템플릿이다.
주로 Flask 웹 프레임워크와 함께 사용되나, 그 외 파이썬에 익숙한 개발자들이 다양한 곳에서 사용한다.
Django Template
Django 는 Python 기반의 템플릿 언어로 마크 업 언어(ex.HTML...) 에서도 동적인 데이터를 표현할 수 있도록 돕는다.
놀랍게도 Django와 Jinja 가 같은 일을 한다~.
Jinja Template / Django Template
같은 개념인 줄 알았는데 다른 개념이었다.
무엇이 더 나은지는 개발자의 취향이고, 이 둘의 차이를 인식하고 적절한 활용을 하도록 하자.
공통점
1. Python 기반의 템플릿 언어이다. 즉, 작성 할 때에는 Python 문법을 기반으로 작성한다.
2. 변수 삽입: 두 템플릿 모두 중괄호 `{{ }}` 를 이용해 템플릿 내부에 변수를 삽입할 수 있다. 이를 이용해 마크업 언어에서도 동적인 데이터 출력이 가능하다.
3. 제어 구조: 두 템플릿 모두 `{% ~~ %} `를 사용해 제어 구조 정의가 가능하다.
차이점
1. 문법의 차이.
- Django : 간단하고, 직관적이다. 변수는 `{{ }}` / 제어는 `{% ~~ %} ` 를 사용한다.
- Jinja : 유연하고 강력하다. 변수는 `{{ }}` / 제어는 `{% ~~ %} ` 를 사용하지만, 옵션이 Django 에 비해 매우 다양해서 딱 잘라 말하긴 어렵다.
2. 태그 이름 충돌
- Django : 일부 태그는 HTML과 유사하여 가끔 헷갈림
- Jinja : 문법이 아예 달라 혼동의 여지가 없음
3. 기능
- Django : 기본적인 기능들을 제공. 복잡한 로직의 한계 존재
- Jinja : 매우 유연한 기능 제공. 작성만 가능하다면 얼마든지 복잡한 로직을 짤 수 있다.
4. 성능
- Django : 상황에 따라 매우 달라지지만, 일반적으로 Jinja 에 비해 무겁고 렌더가 느리다.
- Jinja : 상황에 따라 매우 달라지지만, 일반적으로 Django 에 비해 가볍고 렌더가 빠르다.
Django Template 사용하기
얼핏 보면 Jinja 가 Django에 비해 좋아보인다.
하지만 현재 내가 사용하려는 기능들은 Django 에서도 충분히 구현이 가능 하기 때문에 Django Template 사용을 기준으로 이 문서를 작성한다.
1. 변수 삽입하기
{{ username }}
{{ }} 를 사용해 템플릿 내부에 변수를 삽입할 수 있다.
위 코드는 변수 username 을 출력한다.
활용
<!-- template.html -->
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>Hello, {{ name }}!</h1>
</body>
</html>
# views.py
from django.shortcuts import render
def hello(request):
context = {
'title': 'Django Templates Example',
'name': 'John Doe',
}
return render(request, 'template.html', context)
2. 제어 구조
{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}!</p>
{% else %}
<p>Please log in to continue.</p>
{% endif %}
위 구조와 같이 `{% %}` 구조를 이용해 여러가지 함수를 사용할 수 있다.
if 문 외에도 자주쓰는 코드를 모아봤다.
{% for %}{% endfor %} # Python 의 그 for 문이 맞다.
{% block%}{% endblock %}# 템플릿을 상속할 수 있다.
{% csrf_token %} # 보안을 위한 csrf 기능을 불러온다.
예문 1.
{% for todo in todos %}
<from action="./deleteTodo/" method="GET">
<div class="input-qroup-item" name='todo1'>
<li class="list-group-item">{{ todo.content }}</li>
<input type="hidden" id="todoNum" name="todoNum" value="{{ todo.id }}"> </input>
<span ~~~> </span>
</div>
{% endfor %}
- {% for todo in todos %}{% endfor %}
Django Template 중 for 문을 활용해 웹페이지에서 딕셔너리 불러오기.
해당 객체의 내용물이 몇개가 들었는 지도 모르고, 바뀌니까 for 문을 이용해 반복한다.
todos 라는 객체를 만들었고, 그 안의 내용들 하나하나를 todo 라는 이름으로 가져온다. todos 객체는 딕셔너리 타입으로 키-벨류를 가진
- {{ todo.content }}
사용자에게 보여지는 값.
todo 데이터들 중 content 값을 불러온다.
- {{ todo.id }}
데이터의 id 값을 불러온다.
hidden 으로 불러왔고, 나중에 지우기 위한 마킹.
3. 상속
다른 템플릿을 확장해 기본 레이아웃을 정의, 특정 블럭을 불러와 중복을 줄이고 유지보수를 도움
<!-- base.html -->
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Default Title{% endblock %}</title>
</head>
<body>
<div id="content">
{% block content %}{% endblock %}
</div>
</body>
</html>
<!-- child.html -->
{% extends "base.html" %}
{% block title %}Custom Title{% endblock %}
{% block content %}
<h1>Hello, World!</h1>
{% endblock %}
# views.py
from django.shortcuts import render
def child_page(request):
return render(request, 'child.html')
4. 필터
템플릿 변수에 특정 변환을 적용해 데이터의 형식을 지정 / 변환 하는데 도움을 줌
<!-- template.html -->
<p>The product price is: ${{ price|floatformat:2 }}</p>
# views.py
from django.shortcuts import render
def show_price(request):
context = {
'price': 123.4567,
}
return render(request, 'template.html', context)
5. 보안
csrf 보호기능을 불러와 보안을 강화한다.
<form method="post">
{% csrf_token %}
<!-- 폼 요소들과 버튼 등 추가 -->
</form>
일단 많이 봤던 Django Templates 몇개를 가져와봤다.
더 공부하면서 계속 추가 될 예정
'개념모음' 카테고리의 다른 글
MTV / MVC Pattern (0) | 2023.08.10 |
---|---|
GET / POST (0) | 2023.08.06 |
Django 개념 모음 (0) | 2023.07.28 |