Flaskãã³ãã¬ãŒãç¶æ¿ãšJinja2ã®å æ¬çãªã¬ã€ããããŒã¹ãã³ãã¬ãŒãããããã¯å®çŸ©ãå¹ççãªWebéçºã®ããã®å®è·µçãªäŸã解説ã
Flaskãã³ãã¬ãŒãç¶æ¿ïŒJinja2ãã³ãã¬ãŒãã®æŽçè¡
Webéçºã«ãããŠãè€æ°ã®ããŒãžã«ããã£ãŠäžè²«ããèŠãç®ãšæäœæãç¶æããããšã¯éåžžã«éèŠã§ããFlaskã¯ãPythonã®äººæ°ã®Webãã¬ãŒã ã¯ãŒã¯ã§ãããæè»ã§é«éãªãã³ãã¬ãŒããšã³ãžã³ã§ããJinja2ã®åãæŽ»çšããŠããã³ãã¬ãŒãç¶æ¿ãéããŠããã容æã«ããŸãããã³ãã¬ãŒãç¶æ¿ã«ãããå ±éã®èŠçŽ ãæã€ããŒã¹ãã³ãã¬ãŒããå®çŸ©ããä»ã®ãã³ãã¬ãŒãã§ãããæ¡åŒµããããšã§ãã³ãŒãã®åå©çšãä¿é²ããä¿å®ãç°¡çŽ åã§ããŸãããã®èšäºã§ã¯ãFlaskãã³ãã¬ãŒãç¶æ¿ãšJinja2ã®ååãå®è£ ããã¹ããã©ã¯ãã£ã¹ãå æ¬çã«è§£èª¬ããŸãã
ãã³ãã¬ãŒãç¶æ¿ãšã¯ïŒ
ãã³ãã¬ãŒãç¶æ¿ã¯ãWebãµã€ãã®ã³ã¢æ§é ãšã¬ã€ã¢ãŠããå«ãããŒã¹ãã³ãã¬ãŒããäœæã§ãããã¶ã€ã³ãã¿ãŒã³ã§ããåãã³ãã¬ãŒãã¯ããã®ããŒã¹ãã³ãã¬ãŒããç¶æ¿ããç¹å®ã®ã»ã¯ã·ã§ã³ãŸãã¯ããããã¯ãããªãŒããŒã©ã€ãããŠã³ã³ãã³ããã«ã¹ã¿ãã€ãºã§ããŸãããã®ã¢ãããŒãã¯ãã³ãŒãã®éè€ãæå°éã«æããäžè²«æ§ã確ä¿ããWebã¢ããªã±ãŒã·ã§ã³å šäœã§ã®æŽæ°ãç°¡çŽ åããŸãã
å®¶ã®éåçã®ãããªãã®ã ãšèããŠãã ãããããŒã¹ãã³ãã¬ãŒãã¯ãåºç€ãå£ã屿 ¹ãå«ãå šäœçãªèšèšã§ããååå¥ã®éšå±ïŒåãã³ãã¬ãŒãïŒã¯ãåºæ¬çãªæ§é ãç¶æ¿ããŸãããç°ãªãåºæã塿ãå®¶å ·ã§ã«ã¹ã¿ãã€ãºã§ããŸãã
ãã³ãã¬ãŒãç¶æ¿ã®ã¡ãªãã
- ã³ãŒãã®åå©çšæ§ïŒããŒã¹ãã³ãã¬ãŒãã§å ±éã®èŠçŽ ãå®çŸ©ããè€æ°ã®ããŒãžã§åå©çšããããšã§ãåé·ãªã³ãŒããåé¿ããŸãã
- äžè²«æ§ïŒããããŒãããã¿ãŒãããã²ãŒã·ã§ã³ã¡ãã¥ãŒãªã©ã®å ±æèŠçŽ ã®åäžã®ç宿ºãç¶æããããšã§ãWebãµã€ãå šäœã§äžè²«ããèŠãç®ãšæäœæã確ä¿ããŸãã
- ä¿å®æ§ïŒããŒã¹ãã³ãã¬ãŒãã«å€æŽãå ããããšã§ãæŽæ°ãä¿®æ£ã容æã«ãªãããã¹ãŠã®åãã³ãã¬ãŒãã«èªåçã«åæ ãããŸãã
- æŽçïŒãã³ãã¬ãŒããè«ççãã€éå±€çã«æ§é åããããšã§ãã³ãŒãããŒã¹ã®çè§£ãšç®¡çã容æã«ãªããŸãã
- éçºæéã®ççž®ïŒæ°ããããŒãžããŒãããæ§ç¯ããã®ã§ã¯ãªããããŒã¹ãã³ãã¬ãŒããéå§ç¹ãšããŠæŽ»çšããããšã§ãæéãšåŽåãç¯çŽã§ããŸãã
äž»èŠãªæŠå¿µã®çè§£
1. ããŒã¹ãã³ãã¬ãŒã
ããŒã¹ãã³ãã¬ãŒãã¯ããã³ãã¬ãŒãç¶æ¿æ§é ã®åºç€ã§ããWebãµã€ãã®ãã¹ãŠã®ããŒãžããŸãã¯ã»ãšãã©ã®ããŒãžã§å ±æãããå ±éã®èŠçŽ ãå«ãŸããŠããŸããããã«ã¯éåžžãHTMLæ§é ãCSSã¹ã¿ã€ã«ã·ãŒããJavaScriptãã¡ã€ã«ãããããŒãããã¿ãŒãããã²ãŒã·ã§ã³ã¡ãã¥ãŒãå«ãŸããŸãã
åºæ¬çãªããŒã¹ãã³ãã¬ãŒãïŒbase.html
ïŒã®äŸïŒ
{% block title %}My Website{% endblock %}
My Website
{% block content %}{% endblock %}
ãã®äŸã§ã¯ãããããŒãããã²ãŒã·ã§ã³ã¡ãã¥ãŒãã¡ã€ã³ã³ã³ãã³ããšãªã¢ãããã¿ãŒãæã€åºæ¬çãªHTMLæ§é ãå®çŸ©ããŠããŸãã{% block %}
ã¿ã°ã«æ³šæããŠãã ãããããã¯ãåãã³ãã¬ãŒãã§ãªãŒããŒã©ã€ãã§ããã»ã¯ã·ã§ã³ãå®çŸ©ããŸãã
2. ãããã¯å®çŸ©
ãããã¯ã¯ãããŒã¹ãã³ãã¬ãŒãå
ã®ãã¬ãŒã¹ãã«ããŒã§ãããåãã³ãã¬ãŒãã«ãã£ãŠçœ®ãæããããã倿Žããããããå¯èœæ§ããããŸãããããã¯{% block %}
ããã³{% endblock %}
ã¿ã°ã䜿çšããŠå®çŸ©ãããŸãããããã¯ã䜿çšãããšãããŒã¹ãã³ãã¬ãŒãã®ããŸããŸãªéšåã«ç¹å®ã®ã³ã³ãã³ããæ¿å
¥ã§ããŸãã
äžèšã®base.html
ã®äŸã§ã¯ã2ã€ã®ãããã¯ãå®çŸ©ããŸããã
title
: ãã®ãããã¯ã¯HTMLããã¥ã¡ã³ãã®ã¿ã€ãã«ãå®çŸ©ããŸããcontent
: ãã®ãããã¯ã¯ããŒãžã®ã¡ã€ã³ã³ã³ãã³ããšãªã¢ãå®çŸ©ããŸãã
3. åãã³ãã¬ãŒã
åãã³ãã¬ãŒãã¯ããŒã¹ãã³ãã¬ãŒããç¶æ¿ããããŒã¹ãã³ãã¬ãŒãã§å®çŸ©ããããããã¯ããªãŒããŒã©ã€ãã§ããŸããããŒã¹ãã³ãã¬ãŒããç¶æ¿ããã«ã¯ãåãã³ãã¬ãŒãã®å
é ã«{% extends %}
ã¿ã°ã䜿çšããŸãã
base.html
ãã³ãã¬ãŒããæ¡åŒµããåãã³ãã¬ãŒãïŒindex.html
ïŒã®äŸïŒ
{% extends 'base.html' %}
{% block title %}Home - My Website{% endblock %}
{% block content %}
Welcome to the Home Page!
This is the content of the home page.
{% endblock %}
ãã®äŸã§ã¯ãbase.html
ãã³ãã¬ãŒããæ¡åŒµããtitle
ãšcontent
ãããã¯ããªãŒããŒã©ã€ãããŠããŸããtitle
ãããã¯ã¯ãHome - My Websiteãã«èšå®ãããcontent
ãããã¯ã¯ããŒã ããŒãžåºæã®ã³ã³ãã³ãã«çœ®ãæããããŸãã
4. `super()` 颿°
super()
颿°ã䜿çšãããšãåãã³ãã¬ãŒãå
ããããŒã¹ãã³ãã¬ãŒãã§å®çŸ©ããããããã¯ã®ã³ã³ãã³ãã«ã¢ã¯ã»ã¹ã§ããŸããããã¯ããããã¯ã®ã³ã³ãã³ããå®å
šã«çœ®ãæããã®ã§ã¯ãªãã远å ãŸãã¯å€æŽãããå Žåã«åœ¹ç«ã¡ãŸãã
content
ãããã¯ã«ã³ã³ãã³ãã远å ããããã«super()
ã䜿çšããäŸïŒ
{% extends 'base.html' %}
{% block content %}
{{ super() }}
This is additional content added to the base template's content block.
{% endblock %}
ãã®äŸã§ã¯ãsuper()
颿°ãbase.html
ãã³ãã¬ãŒãããã®content
ãããã¯ã®å
ã®ã³ã³ãã³ããæ¿å
¥ãããã®åŸãåãã³ãã¬ãŒããç¬èªã®ã³ã³ãã³ãããã®äžã«è¿œï¿œï¿œããŠããŸãã
Flaskã§ã®ãã³ãã¬ãŒãç¶æ¿ã®å®è£
Flaskã§ãã³ãã¬ãŒãç¶æ¿ã䜿çšããã«ã¯ããã³ãã¬ãŒããè«ççãªãã£ã¬ã¯ããªæ§é ã«æŽçããFlaskããã³ãã¬ãŒããèŠã€ããããããã«èšå®ããå¿ èŠããããŸãã
1. ãã£ã¬ã¯ããªæ§é
Flaskãã³ãã¬ãŒãã®äžè¬çãªãã£ã¬ã¯ããªæ§é ã¯æ¬¡ã®ãšããã§ãã
my_project/
app.py
templates/
base.html
index.html
about.html
contact.html
static/
style.css
script.js
ãã®æ§é ã§ã¯ãtemplates
ãã£ã¬ã¯ããªã«ãããŒã¹ãã³ãã¬ãŒããšåãã³ãã¬ãŒããå«ããã¹ãŠã®HTMLãã³ãã¬ãŒããæ ŒçŽãããŸããstatic
ãã£ã¬ã¯ããªã«ã¯ãCSSã¹ã¿ã€ã«ã·ãŒããJavaScriptãã¡ã€ã«ãªã©ã®éçãã¡ã€ã«ãæ ŒçŽãããŸãã
2. Flaskã®èšå®
ããã©ã«ãã§ã¯ãFlaskã¯ã¢ããªã±ãŒã·ã§ã³ãšåããã£ã¬ã¯ããªã«ããtemplates
ãšããååã®ãã£ã¬ã¯ããªã§ãã³ãã¬ãŒããæ¢ããŸããããã¯ãFlaskã¢ããªãªããžã§ã¯ãã®template_folder
屿§ãèšå®ããããšã§ã«ã¹ã¿ãã€ãºã§ããŸãã
ã«ã¹ã¿ã ãã³ãã¬ãŒããã©ã«ãã䜿çšããããã«Flaskãèšå®ããäŸïŒ
from flask import Flask, render_template
app = Flask(__name__, template_folder='my_templates')
@app.route('/')
def index():
return render_template('index.html')
3. ãã³ãã¬ãŒãã®ã¬ã³ããªã³ã°
Flaskã§ãã³ãã¬ãŒããã¬ã³ããªã³ã°ããã«ã¯ãrender_template()
颿°ã䜿çšããŸãããã®é¢æ°ã¯ããã³ãã¬ãŒããã¡ã€ã«ã®ååãåŒæ°ãšããŠåãåããã¬ã³ããªã³ã°ãããHTMLæååãè¿ããŸãã
index.html
ãã³ãã¬ãŒããã¬ã³ããªã³ã°ããäŸïŒ
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
åãã³ãã¬ãŒããã¬ã³ããªã³ã°ãããšãFlaskã¯èªåçã«ããŒã¹ãã³ãã¬ãŒããå«ããåãã³ãã¬ãŒãã§å®çŸ©ããããããã¯ã®ãªãŒããŒã©ã€ããé©çšããŸãã
å®è·µäŸ
äŸ1ïŒã·ã³ãã«ãªããã°
ããŒã¹ãã³ãã¬ãŒããšããã°èšäºããšã®åå¥ã®ãã³ãã¬ãŒããæã€ã·ã³ãã«ãªããã°ãäœæããŠã¿ãŸãããã
base.htmlïŒ
{% block title %}My Blog{% endblock %}
My Blog
{% block content %}{% endblock %}
post.htmlïŒ
{% extends 'base.html' %}
{% block title %}{{ post.title }} - My Blog{% endblock %}
{% block content %}
{{ post.title }}
Published on: {{ post.date }}
{{ post.content }}
{% endblock %}
ãã®äŸã§ã¯ãpost.html
ãã³ãã¬ãŒãã¯base.html
ãã³ãã¬ãŒããæ¡åŒµããtitle
ãšcontent
ãããã¯ãããã°æçš¿ã®ã¿ã€ãã«ãæ¥ä»ãã³ã³ãã³ãã§ãªãŒããŒã©ã€ãããŠããŸããpost
倿°ã¯Flaskã«ãŒããããã³ãã¬ãŒãã«æž¡ãããŸãã
app.pyïŒ
from flask import Flask, render_template
app = Flask(__name__)
posts = [
{
'title': 'First Blog Post',
'date': '2023-10-27',
'content': 'This is the content of the first blog post.'
},
{
'title': 'Second Blog Post',
'date': '2023-10-28',
'content': 'This is the content of the second blog post.'
}
]
@app.route('/')
def index():
return render_template('index.html', posts=posts)
@app.route('/post/')
def post(post_id):
post = posts[post_id]
return render_template('post.html', post=post)
äŸ2ïŒå€èšèªãŠã§ããµã€ã
è€æ°ã®èšèªããµããŒããããŠã§ããµã€ããæ§ç¯ããããšãæ³åããŠãã ããããã³ãã¬ãŒãç¶æ¿ã¯ãåããŒãžï¿œï¿œã®ç°ãªãããã¹ãèŠçŽ ã管çããã®ã«åœ¹ç«ã¡ãŸãã翻蚳ãããããã¹ãã®ãã¬ãŒã¹ãã«ããŒãæã€ããŒã¹ãã³ãã¬ãŒããäœæããåèšèªã®åãã³ãã¬ãŒããäœæã§ããŸããããšãã°ãããŒã¹ãã³ãã¬ãŒãããããè±èªãšãã©ã³ã¹èªããµããŒãããããšããŸãã
base.htmlïŒ
{% block title %}{% endblock %}
{% block content %}{% endblock %}
index_en.htmlïŒè±èªããŒãžã§ã³ïŒïŒ
{% extends "base.html" %}
{% block title %}Welcome to My Website{% endblock %}
{% block home_link %}Home{% endblock %}
{% block about_link %}About{% endblock %}
{% block content %}
Welcome!
This is the English version of the homepage.
{% endblock %}
index_fr.htmlïŒãã©ã³ã¹èªããŒãžã§ã³ïŒïŒ
{% extends "base.html" %}
{% block title %}Bienvenue sur mon site web{% endblock %}
{% block home_link %}Accueil{% endblock %}
{% block about_link %}Ã propos{% endblock %}
{% block content %}
Bienvenue !
Ceci est la version française de la page d'accueil.
{% endblock %}
ãã®åçŽåãããäŸã§ã¯ãåèšèªããŒãžã§ã³ã¯ããŒã¹ãã³ãã¬ãŒããæ¡åŒµããã¿ã€ãã«ãããã²ãŒã·ã§ã³ãªã³ã¯ãã¡ã€ã³ã³ã³ãã³ãã®ç¿»èš³ãããããã¹ããæäŸããŸãããã®ã¢ãããŒãã«ããããŠã§ããµã€ãã®ããŸããŸãªèšèªããŒãžã§ã³ã管çãããããªããŸãã
ãã¹ããã©ã¯ãã£ã¹
- ããŒã¹ãã³ãã¬ãŒãã¯ã·ã³ãã«ã«ä¿ã€ïŒããŒã¹ãã³ãã¬ãŒãã«ã¯ããã¹ãŠã®ããŒãžã§å ±æãããå¿ é èŠçŽ ã®ã¿ãå«ããå¿ èŠããããŸãã
- 説æçãªãããã¯åã䜿çšããïŒç®çãæç¢ºã«ç€ºï¿œï¿œï¿œãããã¯åãéžæããŸãã
- ãã³ãã¬ãŒããè«ççã«æŽçããïŒé¢é£ãããã³ãã¬ãŒãããã£ã¬ã¯ããªã«ã°ã«ãŒãåããŸãã
- æ·±ããã¹ããããç¶æ¿ãé¿ããïŒè€éããé¿ããããã«ãç¶æ¿éå±€ã®æ·±ããå¶éããŸãã
- `super()`颿°ã¯æ
éã«äœ¿çšããïŒããŒã¹ãã³ãã¬ãŒãã®ãããã¯ã®ã³ã³ãã³ãã«è¿œå ãŸãã¯å€æŽããå¿
èŠãããå Žåã«ã®ã¿ã
super()
颿°ã䜿çšããŸãã - ãã³ãã¬ãŒãã³ã³ããŒãã³ãã®äœ¿çšãæ€èšããïŒããè€éãªWebãµã€ãã®å Žåã¯ããã³ãã¬ãŒããå°ãᅵᅵåå©çšå¯èœãªã³ã³ããŒãã³ãã«åå²ããããšãæ€èšããŠãã ãããããã¯ãJinja2ã®ã€ã³ã¯ã«ãŒããŸãã¯ãã¯ãã䜿çšããŠå®çŸã§ããŸããããããã¯åªããç¶æ¿æŠç¥ãè£å®ãããã®ã§ããã眮ãæãããã®ã§ã¯ãããŸããã
é«åºŠãªãã¯ããã¯
1. æ¡ä»¶ä»ããããã¯ãªãŒããŒã©ã€ã
ãã³ãã¬ãŒãå ã®æ¡ä»¶æã䜿çšããŠãç¹å®ã®æ¡ä»¶ã«åºã¥ããŠãããã¯ãæ¡ä»¶ä»ãã§ãªãŒããŒã©ã€ãã§ããŸããããã«ããããŠãŒã¶ãŒã®åœ¹å²ã奜ã¿ããã®ä»ã®èŠå ã«åºã¥ããŠããŒãžã®ã³ã³ãã³ããã«ã¹ã¿ãã€ãºã§ããŸãã
{% extends 'base.html' %}
{% block content %}
{% if user.is_authenticated %}
Welcome, {{ user.username }}!
This is the content for authenticated users.
{% else %}
Welcome!
Please log in to access more content.
{% endif %}
{% endblock %}
2. ãã¯ãã®äœ¿çš
Jinja2ãã¯ãã¯Pythonã®é¢æ°ã«äŒŒãŠããŸãããããã¯ããã³ãã¬ãŒãå ããåŒã³åºãããšãã§ããåå©çšå¯èœãªHTMLã³ãŒãã¹ãããããå®çŸ©ã§ããŸãããã¯ãã¯ããã©ãŒã èŠçŽ ãããã²ãŒã·ã§ã³ã¡ãã¥ãŒãç»åã®ã£ã©ãªãŒãªã©ã®ãã³ãã¬ãŒãã³ã³ããŒãã³ãã®äœæã«äœ¿çšã§ããŸãã
å¥ã®ãã¡ã€ã«ïŒmacros.html
ïŒã«ãã¯ããå®çŸ©ããäŸïŒ
{% macro input(name, type='text', value='') %}
{% endmacro %}
ãã³ãã¬ãŒãã§ãã¯ããã€ã³ããŒãããŠäœ¿çšããäŸïŒ
{% from 'macros.html' import input %}
3. ãã³ãã¬ãŒããã£ã«ã¿ãŒ
ãã³ãã¬ãŒããã£ã«ã¿ãŒã䜿çšãããšããã³ãã¬ãŒãå
ã®å€æ°ã®åºåã倿Žã§ããŸããJinja2ã«ã¯ãcapitalize
ãlower
ãupper
ãdate
ãªã©ã®å€ãã®çµã¿èŸŒã¿ãã£ã«ã¿ãŒãçšæãããŠããŸããç¬èªã®ã«ã¹ã¿ã ãã£ã«ã¿ãŒãå®çŸ©ããããšãã§ããŸãã
æ¥ä»ããã©ãŒãããããããã«date
ãã£ã«ã¿ãŒã䜿çšããäŸïŒ
Published on: {{ post.date | date('%Y-%m-%d') }}
çµè«
Jinja2ã䜿çšããFlaskãã³ãã¬ãŒãç¶æ¿ã¯ããã³ãã¬ãŒããæŽçããã³ãŒãã®åå©çšæ§ãä¿é²ããWebã¢ããªã±ãŒã·ã§ã³å šäœã®äžè²«æ§ã確ä¿ããããã®åŒ·åãªæè¡ã§ããããŒã¹ãã³ãã¬ãŒãããããã¯å®çŸ©ãåãã³ãã¬ãŒãã®äž»èŠãªæŠå¿µãçè§£ããããšã§ãä¿å®ã容æã§æ§é åããããã³ãã¬ãŒããäœæããWebéçºã¯ãŒã¯ãããŒãç°¡çŽ åã§ããŸããDRYïŒDon't Repeat YourselfïŒååãæ¡çšãããã³ãã¬ãŒãç¶æ¿ã掻çšããŠãå ç¢ã§ã¹ã±ãŒã©ãã«ãªWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŠãã ããã
ãã®å æ¬çãªã¬ã€ãã§ã¯ãFlaskãã³ãã¬ãŒãç¶æ¿ã®åºæ¬çãªåŽé¢ãã«ããŒããŸããããã®èšäºã§æŠèª¬ãããŠããäŸãšãã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãFlaskãããžã§ã¯ãã§ãã³ãã¬ãŒãç¶æ¿ã广çã«å®è£ ããã°ããŒãã«ãªï¿œï¿œãŒã¶ãŒåãã®æŽçãããä¿å®å¯èœã§ãäžè²«æ§ã®ããWebã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãããããã®ãã¯ããã¯ããããžã§ã¯ãã®ç¹å®ã®ããŒãºã«åãããŠèª¿æŽããJinja2ã®é«åºŠãªæ©èœãæ¢çŽ¢ããŠããã³ãã¬ãŒããã¶ã€ã³æ©èœãããã«åŒ·åããããšãå¿ããªãã§ãã ããã