Golang Gin 中间件将数据传递给模板

Golang Gin Middleware pass Data to Template

您好,我目前正在做一个小项目,我有一个问题。

有没有办法将数据从中间件传递到模板?

例如:

func CheckAuth(c *gin.Context) { //This Middleware gets the user from the session and passes it to the template 
session := sessions.Default(c)
user := session.Get(userkey)

// Get if possible the user from the database with id = user
var account models.Account
if err := models.DB.Where("id = ?", user).First(&account).Error; err != nil {

    _ = 1
}
// pass the account into every temaplte

c.Next()

原因是我在我的布局中使用用户并且必须检查他的用户名或者他是否只是零等等并且在每个函数中进行传递感觉不对? 我知道 Laravel 有这样的东西。

我正在使用 c.HTML 显示 html 文件

提前致谢!

您可以使用 SetFuncMap 或 FuncMap 在模板上创建自定义函数。

You must set it before calling LoadHTMLFiles or LoadHTMLGlob.

中间件是控制值,即:struct

这就是例子

main.go

package main

import (
    "html/template"
    "log"
    "strconv"

    "github.com/gin-gonic/gin"
)

type User struct {
    Username string

    Age int
}

func setUser(u *User) gin.HandlerFunc {
    return func(ctx *gin.Context) {
        // u.Age = 100
        // u.Username = "Default"
        if s, b := ctx.GetQuery("username"); b {
            u.Username = s
        }
        if s, b := ctx.GetQuery("age"); b {
            i, err := strconv.Atoi(s)
            if err != nil {
                panic(err.Error())
            }
            u.Age = i
        }
    }
}

var user = &User{"Default", 100}

func GetUsername() string {
    return user.Username
}

func GetAge() int {
    return user.Age
}

func main() {
    r := gin.New()

    r.SetFuncMap(template.FuncMap{
        "Username": GetUsername,
        "Age":      GetAge,
    })
    r.LoadHTMLGlob("*.tmpl")

    r.GET("/", setUser(user), func(ctx *gin.Context) {
        data := map[string]interface{}{
            "title": "Learning Golang Web",
            "name":  "Batman",
        }

        ctx.HTML(200, "index.tmpl", data)
    })

    log.Fatalln(r.Run())
}

index.tmpl

<!DOCTYPE html>
<html>
  <head>
    <title>{{.title}}</title>
  </head>
  <body>
    <p>Welcome {{.name}}</p>
    <p>Your Username is {{ Username }}</p>
    <p>Your Age is {{ Age }}</p>
  </body>
</html>

如果你去http://localhost:8080/?username=admin&age=50它会显示不同的显示