μ μ§ λ³΄μνκΈ° μ¬μ΄ μ΄ν리μΌμ΄μ μμ± μ μ€μν μ μ κΉλνκ³ μ ꡬμ±λ μ½λλ₯Ό μμ±νλ κ²
λΉμ¦λμ€ λ‘μ§κ³Ό νλ μ ν μ΄μ λ‘μ§μ ꡬλΆνκΈ° μν΄ νλΌμ€ν¬λ Jinja2λΌλ ν νλ¦Ώ μμ§μ μ¬μ©
κΈ°λ³Έμ μΌλ‘ νλΌμ€ν¬λ μ ν리μΌμ΄μ ν΄λ μμ μμΉν templates μλΈν΄λμμ ν νλ¦Ώμ κ²μνλ€. κ·Έκ³³μ μμΉμν¨ user.html νμΌμ μ΄μ©νμ¬ λ λλ§ νλ μμ μ½λλ μλμ κ°λ€.
from flask import Flask, render_template
#...
@app.route('/user/<name>')
def user(name):
return render_template('user_html', name=name)
html νμΌμ λμ μΌλ‘ ν λΉλλ λ³μλ μλ μ½λμ²λΌ μμ±ν μ μλ€.
<h1>Hello, {{name}}!</h1>
<h1>You have a important schedule: {{taskList[3]}}!</h1>
<h1>Hello, {{name|capitalize}}! <!-- name λ³μμ 첫 λ¬Έμλ₯Ό λλ¬Έμλ‘ λ³ν --></h1>
Jinja2λ μ΄λ ν νμ
μ λ³μλΌλ μΈμνλ€.
리μ€νΈ, λμ
λ리, μ€λΈμ νΈμ κ°μ λ³΅ν© νμ
λ μΈμνλ€.
λ³μλ νν°λ₯Ό μ¬μ©νμ¬ μμ ν μ μμΌλ©° νμ΄ν κΈ°νΈλ₯Ό λΆλ¦¬μλ‘ νμ¬ μΆκ°νλ€.
λ³μ νν° μ€ λνμ μΈ κ²λ€μ μλμ μ 리νμλ€.
safe : μ΄μ€μΌμ΄νλ₯Ό μ μ©νμ§ μκ³ κ°μ λ λλ§νλ€
capitalize : 첫 λ²μ§Έ λ¬Έμλ₯Ό λλ¬Έμλ‘ λ§λ€κ³ λλ¨Έμ§λ μλ¬Έμλ‘ λ§λ λ€
lower : κ°μ μλ¬Έμλ‘ λ§λ λ€
upper : κ°μ λλ¬Έμλ‘ λ§λ λ€
title : κ°μ κ° λ¨μ΄λ€μ μΊνΌνΈλΌμ΄μ¦νλ€
trim : μλΆλΆκ³Ό λ·λΆλΆμμ 곡백 λ¬Έμλ₯Ό μμ νλ€
striptags : λ λλ§νκΈ° μ μ κ°μ μ‘΄μ¬νκ³ μλ HTML νκ·Έλ₯Ό μ κ±°νλ€
μ½κ² λ§ν΄ html νμΌ λ΄μ νμ΄μ¬κ³Ό κ°μ λ‘μ§ κΈ°λ₯μ μΆκ°νλ κ²μ΄λ€
λνμ μΈ μλ‘λ ifλ¬Έκ³Ό forλ¬Έ κ·Έλ¦¬κ³ macroμ import κ·Έλ¦¬κ³ include λ±μ΄ μλ€.
<!-- if -->
{% if user %}
Hello, {{ user }}!
{% else %}
Hello, Stranger!
{% endif %}
<!-- for -->
<ul>
{% for comment in comments %}
<li>{{ comment }}</li>
{% endfor %}
</ul>
<!-- macro(function) -->
{% macro render_comment(comment) %}
<li>{{ comment }}</li>
{% endmacro %}
<ul>
{% for comment in comments %}
<li>{{ render_comment(comment) }}</li>
{% endfor %}
</ul>
<!-- macro(function)2: import macro from other file -->
{% import 'macros.html' as macros %}
<ul>
{% for comment in comments %}
<li>{{ macros.render_comment(comment) }}</li>
{% endfor %}
</ul>
<!-- include -->
{% include 'common.html' %}
<!-- inheritance, "base.html" & "*.html" -->
<html>
<head>
{% block head %}
<title>{% block title %}{% endblock %} - My Application</title>
{% endblock %}
</head>
<body>
{% block body %}
{% endblock %}
</body>
</html>
{% extends "base.html" %}
{% block title %}
Index
{% endblock %}
{% block head %}
{{ super() }} <!-- κΈ°μ‘΄μ λ΄μ©μ΄ μ‘΄μ¬νμ¬ μ΄λ₯Ό μ μ§νκΈ° μν κ²½μ° -->
<style></style>
{% endblock %}
{% block body %}
<h1>Hello, World!</h1>
{% endblock%}
λΆνΈμ€νΈλ©μ νΈμν°μμ μ 곡νλ μ€ν μμ€ νλ μμν¬μ΄λ€.
Flask-Bootstrapμ μμ±μμ μλ μ ν리μΌμ΄μ
μΈμ€ν΄μ€μ λκ²¨μ Έμ μ΄κΈ°ννλ€.
from flask.ext.bootstrap import Bootstrap
#...
bootstrap = Bootstrap(app)
μ΄λ¬λ©΄ bootstrap/base.htmlμ extends νμ¬ νμ΄μ§λ₯Ό λ§λ€ μ μλ€.
μλ¬μ λν΄ μ»€μ€ν νΈλ€λ¬λ₯Ό μ 곡νλ μμ μ½λλ μλμ κ°λ€
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
νμ§λ§ μ΄λ³΄λ€λ bootstrap/base.htmlμ μμν νμΌμ μμνλ©° ν΄κ²°νλ κ²μ΄ λ λ«λ€.
ν
νλ¦Ώμ μ§μ λ§ν¬νλ κ²μ²λΌ URLμ μμ±νλ κ²μ κ°λ¨ν λΌμ°ν
λ°©λ²μ΄μ§λ§, μ΄λ μνμ§ μλ μμ‘΄μ±μ μμ±νμ¬ λ§ν¬κ° κΉ¨μ§ μ μλ€.
μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ νλΌμ€ν¬λ url_for() ν¬νΌ ν¨μλ₯Ό μ 곡νλλ° μ΄ ν¨μλ μ ν리μΌμ΄μ
URL 맡μ μ μ₯λ μ 보λ₯Ό ν΅ν΄ URLμ μμ±νλ€.
url_for('index') # '/'
url_for('index', _external=True) # 'http://localhost:5000'
url_for('user', name='john', _external=True) # 'http://localhost:5000/user/john'
url_for('index', page=2) # '/?page=2'
첫λ²μ§Έ μΈμλ λ·° ν¨μμ μ΄λ¦μ΄λ€.
보ν΅μ μλ κ²½λ‘λ₯Ό λ°ννλλ° μ΄λ©μΌλ‘ λ§ν¬λ₯Ό λ³΄λΌ λλ μ λ κ²½λ‘λ₯Ό 'external'λ‘ λ³΄λ΄μΌνλ€.
λμ URLμ λμ ννΈλ₯Ό ν€μλ μΈμ(name='john')λ‘ λ겨μ λ³΄λΌ μ μλ€.
쿼리 λ¬Έμμ΄μ μΆκ° μΈμ('/?page=2')λ₯Ό λν μλ μλ€.
μ μ νμΌμ λΆλ¬μ€λ λ°©λ²μ μλμ κ°λ€.
url_for('static', filename='css/styles.css', _external=True)
# http://localhost:5000/static/css/styles.css
UTC νμ€μλ₯Ό μ¬μ©μμ λ§κ² λ°κΏμ£Όλ λΌμ΄λΈλ¬λ¦¬λ‘ moment.jsκ° μλ€
μ΄λ₯Ό νλΌμ€ν¬μ λ§κ² ν΅ν©ν νμ₯ νλ‘κ·Έλ¨μ΄ Flask-Mometμ΄λ€.
μ¬μ©λ²μ μλμ κ°λ€
# 1
from flask.ext.moment import Moment
moment = Moment(app)
# 2.
{% block scripts %}
{{ super() }}
{{ moment.include_moment() }}
{% endblock %}
# 3.
from datetime import datetime
@app.route('/')
def index():
return render_template('index.html', current_time=datetime.utcnow())
# 4.
<p>The local date and time is {{ moment(current_time).format('LLL') }}</p>
<p>That was {{ moment(current_time).fromNow(refresh=True) }}</p>
moment.jsμμ μ¬μ©ν μ μλ λ©μλλ‘λ format(), fromNow(), fromTime(), calendar(), valueOf(), unix(), lang() κ° μλ€.