인프런 커뮤니티 질문&답변

빅재미코딩님의 프로필 이미지
빅재미코딩

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

장고 주요 구성요소

템플릿 엔진 설명 중에서

해결된 질문

작성

·

321

·

수정됨

0

 # Q1

`템플릿엔진` 설명하실때

`"복잡한 문자열을 손쉽게 조합하기 위한, 문자열 렌더링 엔진"` 이라고 하셨는데,

복잡한문자열 이라는게 예를 들면 어떤건가요?
데이터가 동적으로

최종적으로 장고에서 나가는 문자열을 만들때

  1. 전체적인 구조(와꾸) 예) HTML, 이메일공통내용 등

  2. 1번에서 데이터가 동적으로 바뀔 필요가 있을때

동적을 바뀔 데이터를 `복잡한 문자열` 이라고 한건가요?


  # Q2

장고설계철학 들어서 꼭 템플릿엔진이 템플릿파일(html)을 뷰단으로 렌더링/포워딩 할때만 쓰이는게 아니고 메일내용 만들때도 인지는 하고 있는데

자꾸 복잡한문자열 저 말이 무슨 말인지 몰라서 여쭤봅니다.

 그리고 장고템플릿엔진 API

설계철학에서 배운 render 함수render_to_string함수가 맞죠? 그리고 상대적으로 자주 쓰이는 다른 API는 어떤상황에서, 어떤API가 더 있을까요?

  • (from django.shortcuts import render)

  • (from django.template.loader import render_to_string)

  • render 함수 내부적으로는

    • render -----> render_to_string 참조 한다고 기억하고 있습니다.


 # Q3

  • 그리고 장고에서 최종적으로 나가는(HTTP응답/이메일내용) 데이터의 포맷

  • "HTML, 이메일공통내용(텍스트) ..." 처럼 모두 문자열 인가요?

  • 아니면 장고에서 최종적으로 나가는 것 중에서 문자열이 아닌것들은 장고템플릿엔진 거치지 않고,

    문자열인 것들만 장고템플릿엔진 거치고 최종적으로 문자열 형태로 나가는건가요?

 

답변 3

1

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

아래처럼 변수의 값 만을 참조하여 문자열을 완성하는 경우에는 굳이 템플릿 엔진이 필요없을 수 있습니다. 아래처럼 파이썬 기본 문법으로도 충분하니깐요.

name = "이진석"
message = f"안녕하세요. {name}"

하지만, 아래처럼 문자열 완성에 있어서 분기와 반복 등의 기능이 필요하다면 템플릿 엔진의 힘을 빌리는 것이 좋습니다.

name = "이진석"
member_grade = "일반"
favorite_foods = [
{"name": "비빔밥", "score": 5},
{"name": "국수", "score": 1},
{"name": "햄버거", "score": 5},
]

위 값을 기반으로 아래의 문자열을 생성한다고 했을 때, 템플릿 엔진의 도움없이 파이썬 코드 만으로 생성하려 해보시면, 생각보다 번잡한 코드가 나옵니다. 가독성 및 확장성도 좋지 않습니다.

안녕하세요. 이진석님.
일반등급에는 결제금액에서 0.1%를 포인트로 적립됩니다.
좋아하는 음식
- 비빔밥에는 5점을 주셧네요. :D
- 국수에는 1점을 주셨네요. :-(
- 햄버거에는 5점을 주셨네요. :D

하지만 템플릿 엔진의 도움을 빌린다면, 템플릿 엔진 내에 문자열 생성에 필요한 모든 룰을 명시하여 가독성높고 확장성높은 방법으로 문자열을 생성하실 수 있습니다.

안녕하세요. {{ name }}님.
{{ member_grade }}에는 결제금액에서
{% if member_grade == "일반" %}0.1%{% else %}1%{% endif}를 포인트로 적립됩니다.
좋아하는 음식
{% for food in favorite_foods %}
- {{ food.name }}에는 {{ food.score}}점을 주셨네요. {% if food.score < 3 %}:-({% else %}:D{% endif %}
{% endfor %}

충분한 답변이 되었을 지 잘 모르겠습니다.

살펴보시고, 추가 질문 남겨주세요.

화이팅입니다. :-)

0

아 Q2 이해됬습니다

헷갈리는 와중에 잘못 생각하고 질문드린게 있었고 바로잡았습니다.

render함수 리턴은 장고에서 나가는게 응답객체라 `문자열 아님`. 장고템플릿엔진을 사용해서 문자열로 만들긴 하는데 reder 입장에서는 중간결과일뿐이고 최종적으로 장고에서 나가는 건 응답 객체며, 장고템플릿엔진(장고 OGNL / 표현식 문법)이 중간과정에서 한번 가미되긴함. render 함수는 내부적으로 render_to_string 함수를 디펜던시함. render_to_string함수의 리턴은 문자열이나 중간과정일뿐이며 render함수의 최종 출력은 HTTP응답객체임.

라고 이해했습니다. 이해는 했다고 생각하는데...맞는지궁금합니다..?ㅎㅎ

Q3 도 이해 했습니다.

너무 장고템플릿엔진 문법이 응답(장고에서 나가는 endpoint) HTML렌더링(보통 많이썼던)뿐 아니라 모든 문자열에 쓰인다 라는 말에 너무꽂혀서 생각하여 질문드렸네요

 

감사합니다.

이진석님의 프로필 이미지
이진석
지식공유자

Q2. 근접하게 이해하신 듯 합니다.

보충하자면, 장고는 View에게 반환값으로 기대하는 것은 HttpResponse 객체입니다. render 함수를 통해 지정 템플릿을 활용한 HttpResponse 객체를 손쉽게 생성할 수 있습니다.

render 내부적으로 render_to_string 반환값으로 HttpResponse를 생성하여 반환합니다.
관련 코드 :https://github.com/django/django/blob/main/django/shortcuts.py#L25

0

넵 `복잡한 문자열` 이라는게 생각하던게 맞는것 같습니다! 감사드립니다

혹시...시간이 되시면 `Q2` 와 `Q3` 도 궁금합니다...!

이진석님의 프로필 이미지
이진석
지식공유자

아. 추가 질문이 있었군요.

Q2.

render는 인자로 HttpRequest를 받으며 HttpResponse 객체를 반환합니다. 그러니 View 함수에서 사용을 할테구요. 장고는 웹프레임워크이니 함수기반뷰(FBV)에서는 render 사용을 필수일 것입니다.

render_to_string은 str을 반환합니다. 어떤 text file을 생성해야할 때 (yaml, css, js 등등), 어떤 특별한 생성 라이브러리가 없을 때 render_to_string 사용을 검토해보세요. 커스텀 Rule로 text file에서 사용할 문자열을 생성하실 수 있습니다.

Q3.

문자열(str) 생성에 템플릿 엔진을 사용하실 수도 있습니다. 이는 선택일 뿐 필수적인 것은 아닙니다.
문자열이 코드 내에서 생성하여 프로그램 밖으로 내보내는 가장 일반적인 타입이구요.

문자열이 아닌 다른 데이터들은 그 데이터 성격에 맞게 다른 방법으로 생성해야합니다.
이미지 데이터는 직접 이미지 데이터를 바이트 단위로 핸들링하는 것은 힘드니까 Pillow 등의 라이브러리를 사용할테구요.
엑셀 데이터도 직접 엑셀 데이터를 바이트 단위로 핸들링하는 것은 힘드니까 openpyxl 등의 라이브러리를 사용할 것입니다.


살펴보시고, 궁금하신 내용은 추가 질문 남겨주세요. :-)


ㅎㅎ...추가질문이 있는데

장고는 웹프레임워크이니 함수기반뷰(FBV)에서는 render 사용을 필수일 것입니다.

근데 함수기반뷰면 보통 스프링/플라스크 등 웹에서의 컨트롤러(장고의 뷰) 역할의 방식 아닌가요?

그럼 뷰템플릿(페이지) 렌더링 하면서도 리턴하고
때로는 단일 문자열 혹은 json객체도 리턴 할 수 있지 않나요?

그럼 FBV 방식의 뷰(컨트롤러) 구현에서 render 함수는 필수가 아닌가요?

 

플라스크를 써봤었는데 플라스크의 render_template 함수(템플릿+데이터 포워딩) 와 jsonify(리소스만 포워딩) 함수 라는 사실에 기대서 질문드리는거라

장고의 render 함수가 꼭 그런건 아닐수도 있어서 조심스럽게 여쭤봅니다.

이진석님의 프로필 이미지
이진석
지식공유자

View 에서 템플릿을 활용한 응답이 필요하실 때에는 render를 쓰시면 편리하시고,

그 외의 응답에 대해서는 HttpResponse 인스턴스를 직접 생성하시거나, json 응답의 경우 HttpResponse를 활용하시거나 JsonResponse를 활용하실 수 있습니다.

감사합니다! 상세하게 궁금한게 너무 많네요.

빅재미코딩님의 프로필 이미지
빅재미코딩

작성한 질문수

질문하기