Django アプリとはいっても非常に小規模なサイトの話です。
機能としては、
- サイト全体が Django のテンプレートを使用
- お申し込みフォーム(確認画面あり)
- お問い合わせフォーム(確認画面あり)
- お知らせ更新機能(今は html 直書きだったりするけどついでに DB から読み込みたい)
Gin は高速という噂の golang の Web フレームワークで、pongo2 は Django 風の記述ができるテンプレートエンジンです。 Gin にもテンプレートエンジンは付属していますが、 pongo2 を使って既存の Django 向けに書かれているテンプレートを極力活かしたいので使うことにしました。
とりあえず、単純に html を読み込んでレンダリングするのと静的なファイルの配信までやってみます。
ディレクトリ構成は、
.
├── main.go
└── static
├── images
├── css
└── js
└── templates
├── base.html
└── index.html
index.html は base.html を {% extends "base.html" %}
しています。
package main
import "github.com/flosch/pongo2"
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
tpl, err := pongo2.FromFile("templates/index.html")
if err != nil {
c.String(500, "Internal Server Error")
}
err = tpl.ExecuteWriter(pongo2.Context{"title": "Welcome to my homepage!"}, c.Writer)
if err != nil {
c.String(500, "Internal Server Error")
}
})
r.Run(":8080")
}
Renderer がプラガブルになったら c.HTML
が使えるようになるみたいですが、今のところはこんな感じで。
pongo2.Context
でテンプレートで使用する変数を渡します。
ここでは、 {{ title }}
が使用できます。
あとは、静的なファイルの配信です。
これは r.Static("/static", "static")
を一行追加するのみ。ついでに/
の処理を外に出してみる。
package main
import "github.com/flosch/pongo2"
import "github.com/gin-gonic/gin"
func indexEndpoint(c *gin.Context) {
tpl, err := pongo2.FromFile("templates/index.html")
if err != nil {
c.String(500, "Internal Server Error")
}
err = tpl.ExecuteRW(c.Writer, pongo2.Context{"title": "Welcome to my homepage!"})
if err != nil {
c.String(500, "Internal Server Error")
}
}
func main() {
r := gin.Default()
r.GET("/", indexEndpoint)
r.Static("/static", "static")
r.Run(":8080")
}
これでとりあえずトップページの表示はいけました。
既存の Django テンプレートは特に難しいことをしていない(extend と block と変数の表示くらい)なので完全に使い回すことができました。
ついでに、 go-bindata を使って、ワンバイナリにしようかと思ったけど、 pongo2
的につらそうだったのでやめました…。(ちゃんと調べてない)
次回はフォームまわりの処理でもやろうかと。