tag:crieit.net,2005:https://crieit.net/magazines/aocory/Python%E3%81%A7%E4%BD%9C%E3%82%8B%E4%BF%BA%E4%BF%BA%E9%9D%99%E7%9A%84%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC/feed Pythonで作る俺俺静的サイトジェネレーターの投稿 - Crieit Crieitで連載「Pythonで作る俺俺静的サイトジェネレーター」の最近の投稿 2019-08-09T07:55:44+09:00 https://crieit.net/magazines/aocory/Python%E3%81%A7%E4%BD%9C%E3%82%8B%E4%BF%BA%E4%BF%BA%E9%9D%99%E7%9A%84%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC/feed tag:crieit.net,2005:PublicArticle/15309 2019-08-09T07:55:44+09:00 2019-08-09T07:55:44+09:00 https://crieit.net/posts/Python-5d4ca870d8e48 テンプレート機能を実装 Pythonで作る俺俺静的サイトジェネレーター <p>ページを作るときはやっぱりlayouts.viewなどのように部分を切り出したいですよね?(Laravel脳)</p> <h2 id="CSV読み込む"><a href="#CSV%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80">CSV読み込む</a></h2> <pre><code class="python">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) </code></pre> <p>CSVを辞書型で読み込めます。</p> <h2 id="テンプレートはjinja2を採用"><a href="#%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%81%AFjinja2%E3%82%92%E6%8E%A1%E7%94%A8">テンプレートはjinja2を採用</a></h2> <p>jinjya2(神社)というテンプレートがあったのでそちらを流用<br /> falskなど有名フレームワークでも採用されている。<br /> 今更ながらFlaskで実装してもという後悔の念がありますが、車輪の再開発にも学びがあるはず。</p> <p>layout.html</p> <pre><code><!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> </code></pre> <p>page.html</p> <pre><code class="python">{# childe.tpl 子テンプレート #} {% extends "/template/layouts.html" %} {# 親テンプレートを指定 #} {% block title %}Index{% endblock %} {% block head %} <span>{</span><span>{</span> super() <span>}</span><span>}</span> <style type="text/css"> .important { color: #336699; } </style> {% endblock %} {% block content %} {% set text='aaaa' %} <h1><span>{</span><span>{</span> title <span>}</span><span>}</span></h1> <p class="important"> Welcome to my awesome homepage. </p> {% endblock %} </code></pre> <p>page.htmlを読み込むとlayouts.htmlも読み込める</p> <pre><code class="python">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) </code></pre> <p>うん。これは便利</p> <p>個別ページはこんな感じになった。</p> <pre><code class="python">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) </code></pre> <p>次はカテゴリーページを実装してみる</p> aocory tag:crieit.net,2005:PublicArticle/15307 2019-08-08T08:22:23+09:00 2019-08-08T08:22:23+09:00 https://crieit.net/posts/Python-5d4b5d2f1e691 Pythonで作る俺俺静的サイトジェネレーター <p>サイト作りたいけどmarkdown? ビジュアルエディタ?は使いたくない。<br /> できれば<strong>生CSVで作りたい。</strong><br /> そういう<strong>変態居ませんか?</strong><br /> 居ませんね。<br /> なので、良いものがありません。<br /> pythonならflaskとか色々あるやん。。って思われがちですが<strong>SQLはお金がかかるし使いたくない。</strong><br /> ユーザーコミュニティ作るならまだしも、情報メインのAdSenseサイトを作るのにワードプレスはランニングコスト高すぎって思うんです。</p> <p>どうせ、<strong>アクセスないし。ワードプレスなんてお金も無駄</strong></p> <p>というわけで自分で作るしかないです。</p> <p>折角なのでCrieitでネタにします。</p> <h2 id="作りたいモノ"><a href="#%E4%BD%9C%E3%82%8A%E3%81%9F%E3%81%84%E3%83%A2%E3%83%8E">作りたいモノ</a></h2> <p>csvファイル→htmlファイル</p> <p>要件定義は非常に大切ですが、<strong>実際作ってみないと要件は分からない</strong><br /> ということで、炎上プロジェクトにありがちな要件定義無しでの開発をしていきたいと思います。</p> <h2 id="ビルド周りを作る"><a href="#%E3%83%93%E3%83%AB%E3%83%89%E5%91%A8%E3%82%8A%E3%82%92%E4%BD%9C%E3%82%8B">ビルド周りを作る</a></h2> <p>いきなりですが、とりあえず、ファイルを作るビルド周りから行っていきます。</p> <pre><code class="python">import os new_dir_path = "build" new_filename = "index.html" new_file_content = "hello world" def build(dir_path, filename, content): os.makedirs(dir_path, exist_ok=True) with open(os.path.join(dir_path, filename), "w") as f: f.write(content) </code></pre> <p>osを読み込んでbuildにindex.htmlを入れる要に設定しています。</p> <h2 id="次は何しよう?"><a href="#%E6%AC%A1%E3%81%AF%E4%BD%95%E3%81%97%E3%82%88%E3%81%86%EF%BC%9F">次は何しよう?</a></h2> <p>テンプレート実装してみよう</p> <p>まだまだ続く</p> aocory