32
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Django アプリを golang の Gin と pongo2 で書き直す その1

Last updated at Posted at 2014-07-16

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" %} しています。

main.go
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") を一行追加するのみ。ついでに/の処理を外に出してみる。

main.go
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 的につらそうだったのでやめました…。(ちゃんと調べてない)

次回はフォームまわりの処理でもやろうかと。

32
33
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?