golangWeb框架---github.com/gin-gonic/gin學習六(靜態檔案、模版、模版函式)

金丙坤發表於2018-09-21

靜態檔案

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	router := gin.Default()

	router.Static("/assets", "./assets")
	router.StaticFS("/more_static", http.Dir("assets"))
	router.StaticFile("/favicon.ico", "./assets/a.png")

	router.Run(":8080")
}

在我的專案下建立一個assets資料夾
在這裡插入圖片描述

直接上圖就行:
1、訪問more_static
在這裡插入圖片描述

2、訪問assets下的某個檔案
在這裡插入圖片描述

3、直接訪問assets下的某個檔案
在這裡插入圖片描述

下載服務端檔案

我們就下載我們上例中的圖片,路徑為
http://127.0.0.1:8080/favicon.ico

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {

	router := gin.Default()

	router.StaticFile("/favicon.ico", "./assets/a.png")

	router.GET("/someDataFromReader", func(c *gin.Context) {
		response, err := http.Get("http://127.0.0.1:8080/favicon.ico")
		if err != nil || response.StatusCode != http.StatusOK {
			c.Status(http.StatusServiceUnavailable)
			return
		}

		reader := response.Body
		contentLength := response.ContentLength
		contentType := response.Header.Get("Content-Type")

		extraHeaders := map[string]string{
			"Content-Disposition": `attachment; filename="gopher.png"`,
		}

		c.DataFromReader(http.StatusOK, contentLength, contentType, reader, extraHeaders)
	})

	router.Run(":8080")
}

瀏覽器輸入http://127.0.0.1:8080/someDataFromReader 就實現了圖片的下載

模版語言(1)

雖然現在業務開發,需要資料分離,但是web框架都有自己的模版語言,比如Django的Jinja2,Jinja2是基於python的模板引擎,功能比較類似於於PHP的smarty,J2ee的Freemarker和velocity。
今天就來了解下gin裡面的是如何使用的,這些東西都很簡單,直接上程式碼,看效果即可

func main() {

	router := gin.Default()

	router.LoadHTMLGlob("template/*")
	router.GET("/index", func(c *gin.Context) {
		c.HTML(http.StatusOK, "view.html", gin.H{
			"title": "Main website",
		})
	})

	router.Run(":8080")
}

看一下view.html程式碼

<html>
<h1>
{{ .title }}
</h1>
</html>

直接上效果圖:
在這裡插入圖片描述

模版語言(2)

上一個例子的模版頁面,是放到template的目錄下,如果在template下有多級目錄呢?比如下面這個截圖
在這裡插入圖片描述

然後看後端程式碼如下:

func main() {

	router := gin.Default()

	router.LoadHTMLGlob("template/**/*")
	router.GET("/posts/index", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index1.tmpl", gin.H{
			"title": "Posts",
		})
	})
	router.GET("/users/index", func(c *gin.Context) {
		c.HTML(http.StatusOK, "users/index2.tmpl", gin.H{
			"title": "Users",
		})
	})

	router.Run(":8080")
}

index1.tmpl

<html><h1>
	{{ .title }}
</h1>
<p>Using posts/index1.tmpl</p>
</html>

index2.tmpl

{{ define "users/index2.tmpl" }}
<html><h1>
	{{ .title }}
</h1>
<p>Using users/index2.tmpl</p>
</html>
{{ end }}

效果圖如下:
在這裡插入圖片描述

在這裡插入圖片描述

自定義模版函式

我們還可以自己定製模版函式
You may use custom delims

r := gin.Default()
	r.Delims("{[{", "}]}")
	r.LoadHTMLGlob("/path/to/templates"))

設定router.Delims需要的格式,然後SetFuncMap設定需要的值函式,然後通過c.HTML渲染資料即可

程式碼比較簡單,我都是直接上程式碼,看效果即可

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"html/template"
	"net/http"
	"time"
)

func formatAsDate(t time.Time) string {
	year, month, day := t.Date()
	return fmt.Sprintf("%d/%02d/%02d", year, month, day)
}


func main() {

	router := gin.Default()

	router.Delims("{[{", "}]}")
	router.SetFuncMap(template.FuncMap{
		"formatAsDate": formatAsDate,
	})
	router.LoadHTMLFiles("template/a.html")

	router.GET("/raw", func(c *gin.Context) {
		c.HTML(http.StatusOK, "a.html", map[string]interface{}{
			"now": time.Date(2017, 07, 01, 0, 0, 0, 0, time.UTC),
		})
	})

	router.Run(":8080")
}

模版程式碼a.html

<body>

Date: {[{.now | formatAsDate}]}

</body>

最後看下效果圖:
在這裡插入圖片描述

相關文章