2019-08-09に投稿

テンプレート機能を実装 Pythonで作る俺俺静的サイトジェネレーター

ページを作るときはやっぱりlayouts.viewなどのように部分を切り出したいですよね?(Laravel脳)

CSV読み込む

import csv
csv_file = open(config.csv_path, "r",
                encoding="utf_8", errors="", newline="")
f = csv.DictReader(csv_file, delimiter=",", doublequote=True,
               lineterminator="\r\n", quotechar='"', skipinitialspace=True)

CSVを辞書型で読み込めます。

テンプレートはjinja2を採用

jinjya2(神社)というテンプレートがあったのでそちらを流用
falskなど有名フレームワークでも採用されている。
今更ながらFlaskで実装してもという後悔の念がありますが、車輪の再開発にも学びがあるはず。

layout.html

<!DOCTYPE html>
<html lang="ja">
    <head>
        <!-- 共通ヘッダ -->
        {% block head %}
        <link rel="stylesheet" href="style.css" />
        <title>{% block title %}{% endblock %} - My Webpage</title>
        {% endblock %}
    </head>
    <body>

        <!-- コンテンツ部分 -->
        <div id="content">
            {% block content %}
            {% endblock %}
        </div>

        <!-- 共通フッター -->
        <div id="footer">
            {% block footer %}
            &copy; Copyright 2008 by <a href="http://domain.invalid/">you</a>.
            {% endblock %}
        </div>
    </body>
</html>

page.html

{# childe.tpl 子テンプレート #}  

{% extends "/template/layouts.html" %} {# 親テンプレートを指定 #}

{% block title %}Index{% endblock %}

{% block head %}
    {{ super() }}
    <style type="text/css">
        .important { color: #336699; }
    </style>
{% endblock %}

{% block content %}
    {% set text='aaaa' %}
    <h1>{{ title }}</h1>
    <p class="important">
      Welcome to my awesome homepage.
    </p>
{% endblock %}

page.htmlを読み込むとlayouts.htmlも読み込める

from jinja2 import Template, Environment, FileSystemLoader
for row in f:
    template_path = "/template/page.html"
    env = Environment(loader=FileSystemLoader('.'), trim_blocks=False)
    template = env.get_template(template_path)
    disp_text = template.render(row)

うん。これは便利

個別ページはこんな感じになった。

for row in f:
    template_path = "/template/page.html"
    env = Environment(loader=FileSystemLoader('.'), trim_blocks=False)
    template = env.get_template(template_path)
    disp_text = template.render(row)
    dir_path=os.path.join('build',row['cat_lv01_slug'],row['cat_lv02_slug'])
    filename=""+row['slug']+'.html'
    #書き込み関数
    write_page(dir_path, filename, disp_text)

次はカテゴリーページを実装してみる

ツイッターでシェア
みんなに共有、忘れないようにメモ

view_list Pythonで作る俺俺静的サイトジェネレーター
第1回 Pythonで作る俺俺静的サイトジェネレーター
第2回 テンプレート機能を実装 Pythonで作る俺俺静的サイトジェネレーター

aocory

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント