Hugoで人気記事を表示するためJSONを返すAPIサーバを作りData-driven Contentを試してみた
Hugo Data-Driven Contentを試してみる。
目的
- サイドバーの人気記事をJavascriptを利用せずに、表示できるようにしたい。
- 脱サードパーティアプリ。
対応方法
- Hugo Data Filesを利用する
- Hugo Data-driven contentを利用する
1つ目のData Filesは、関連記事表示の際に利用したので、今度は2つのHugo Data-driven Contentを試してみる。
実装方法は、以下の通り。
- Google Analyticsから情報を取得し、その結果を加工してJSONを返すAPIサーバを作る。
- その後、HugoのData-driven contentの機能を利用して、APIを叩いてJSONを取得し、表示させる。
JSONを返すAPIサーバを立てる
以下のページを参考に、Pythonのfalconでつくった。さくっとAPIサーバが構築できて非常に良い。
- Falcon - The minimalist Python WSGI framework
- Falconで光速のWeb APIサーバーを構築する - Qiita
- Python Falcon ちょっと本気のクイックスタート - Qiita
# -*- coding: utf-8 -*-
import json
import falcon
from analytics import Analytics
class HelloResource(object):
def on_get(self, req, resp):
analytics = Analytics()
scope = ['https://www.googleapis.com/auth/analytics.readonly']
service_account_email = "analytics@meganii-reports.iam.gserviceaccount.com"
key_file_location = './key.pem'
# apiの呼び出し・結果出力
service = analytics.get_service('analytics', 'v3', scope, key_file_location, service_account_email)
profile = analytics.get_first_profile_id(service)
resp.body = json.dumps({ "rows" : analytics.get_json(analytics.get_rankings_results(service, profile))} )
app = falcon.API()
app.add_route("/", HelloResource())
if __name__ == "__main__":
from wsgiref import simple_server
httpd = simple_server.make_server("127.0.0.1", 3000, app)
httpd.serve_forever()Hugo
popular.html
{{ $dataJ := getJSON "http://localhost:3000/" }}
<ul class="list-unstyled urllist">
{{ range first 5 $dataJ.rows }}
<li>
<div>
<a href="{{ index . 1 }}">
<img class="urllist-img" src="{{ index . 2 }}" width="75" height="75" />
</a>
<a href="{{ index . 1 }}">{{ index . 0 }}</a>
</div>
</li>
{{ end }}
</ul>Hugo build
hugo server -t hugo-zen
あとは、いつも通りhugo serverやhugo buildを実行すれば、動的にJSONリソースにアクセスしてページを生成してくれる。
気をつけないといけないのは、キャッシュされていること。値が変わらないときは、キャッシュされていることを忘れていた。
--ignoreCacheとかオプションに指定してあげれば、キャッシュしないようにできる。
Pythonスクリプトのデーモン化
Hubotをデーモン化したときに利用したpm2を使用した。Node.js用のデーモン化ツールと思っていたがそのほかの言語でも利用できたことがわかった。
取り急ぎ、pm2で対応した。
http://pm2.keymetrics.io/docs/usage/quick-start/
まとめ
Pythonで簡単にAPIサーバを構築して、静的サイトジェネレータで動的にサイトを生成できた。
後は、Circle CIに組み込めば、git pushしたときに人気記事を読込直して生成してくれる。
Links in this post
Backlinks
静的サイトジェネレータHugo
Hugo入門 静的サイトジェネレータ「Hugo」でシンプルブログサイトを構築する 静的サイトジェネレータ「Hugo」インストール 静的サイトジェネレータ「Hugo」〜公開方法〜 サイト構築 Hugoのテーマでsubmoduleを使う方法 HugoでのシンタックスハイライトにPython Pygmentsが不要となった HugoのRelated Contentを利用して関連記事を表示する gulpで画像の最適化 Hugoソースコードリーディング〜Taxonomy〜 Render Hooks for Code Blocksを利用してコードブロックにファイル名を表示する Hugoでブログカードを作成する(resources.GetRemote利用) Templates 【Hugo】Partial Templateでは複数returnを記述する早期Returnを使えない 【Hugo】images.TextでOGP画像を生成する Shortcodes Hugo Shortcodesの作り方 HugoのShortcodesを利用してAmazon紹介リンクタグを作成 HugoでAMP対応のブログカードを作る AMP対応 AMP向けのミニマルCSSフレームワーク「1BX」をHugoに導入した AMPページの最適化〜ぼくのAMPサイトがこんなに遅い訳がない〜 AMP OptimizerによるAMPのさらなる最適化 AMP Service WorkerでPrefetch Linksを実現する Data Driven Content Hugoで人気記事を表示するためJSONを返すAPIサーバを作りData-driven Contentを試してみた Tailwind CSS HugoでTailwindCSSを利用しAMP Validなページを生成する ビルド npm-run-allでローカルAPI serverとHugo serverを同時に実行する GitHub Actionsのスケジューラ実行を利用して定期的にビルドする Circle CIでHugoのビルド・デプロイを実行する コンテンツ作成 Git pre-commitフックでFrontmatterの「更新日時」を自動更新する Hugoでブログ記事一覧ページ(ブログアーカイブページ)を作成する 移行 はてなダイアリーからはてなブログ経由で独自ドメインのブログに記事を移行しました JekyllからHugoへの移行ポイント Hugoで生成した静的サイトのホスト先をさくらVPSからNetlifyに変更する 書籍
2017-12-31
Circle CIでテストを定期実行する
前回、HugoのData-driven contentを試した。
Hugoで人気記事を表示するためJSONを返すAPIサーバを作りData-driven Contentを試してみた
これによって、毎回hugo buildすることによって、人気記事を更新する仕組みができた。後は、Circle CIを定期実行させる。これは、Circle CIのAPIを利用すれば実現できる。
2016-09-08