jinja template에서 python function 더 사용하기

jinja template에서 python의 다른 펑션을 사용해봅시다

  • 음, 사실 간단한 겁니다. 예를 들어서, enumerate, zip등을 jinja template에서 사용해보고 싶다는 말입니다.
  • 기본적으로는 다음과 같은 것만 가능합니다.

<div>
    {% for a in test_lst1 %}
        {{i}}, {{a}}<br>
    {% endfor %}
</div>

  • 그런데, 필요에 따라서, zip, enumerate을 사용하고 싶을 때가 있습니다.
  • 이럴 때는 그냥, render_template에서 변수로 함께 넘겨주면 됩니다.
  • 예를 들어서, 파이썬에서 render_template에서 변수들 넘기는 것처럼 모두 넘겨주고,
@app.route('/test')
def test():
    test_lst1 = [f"aa{i}" for i in range(0, 10)]
    test_lst2 = [f"bb{i}" for i in range(0, 10)]
    return render_template('test.html', 
        test_lst1=test_lst1, 
        test_lst2=test_lst2, 
        enumerate=enumerate, 
        zip=zip, 
        pd=pd,
        Markup=Markup
    )
  • html에서는 다음처럼 그냥 모두 사용하면 됩니다.

<div>
    {% for i, a in enumerate(test_lst1) %}
        {{i}}, {{a}}
        <br>
    {% endfor %}
    {% for a, b in zip(test_lst1, test_lst2) %} 
        {{a}}, {{b}}
        <br> 
    {% endfor %}
    {{Markup(pd.DataFrame({"aa":test_lst1}).to_html())}}
</div>

  • 만약, 매번 넘기는 것이 귀찮다면, 다음처럼 세팅을 하는 것이 더 좋을 수 있구요.
### jinja update 
app.jinja_env.globals.update(
    zip=zip, 
    enumerate=enumerate, 
)
########################

wrap-up

  • 처음에는 jinja template이 너무 할 수 있는게 없다라고 생각했는데, 생각보다 확장이 쉽게 됩니다.
  • 이렇게 확장이 되는 것이면, 사실 좀 지나치게 말해서 javascript의 많은 부분이 필요하지 않고, python으로 대부분을 처리할 수 있는 것이 아닐까? 싶기도 하네요.

댓글남기기