从here学习围棋和杜松子酒。 所以我有这样的路由器
userRoutes.POST("/login", ensureNotLoggedIn(), performLogin)
处理程序函数就是这样
func performLogin(c *gin.Context) {
username := c.PostForm("username")
password := c.PostForm("password")
if isUserValid(username, password) {
token := generateSessionToken()
c.SetCookie("token", token, 3600, "", "", false, true)
//is_logged_in is not working in template
c.Set("is_logged_in", true)
render(c, gin.H{"title": "Successful Login"}, "login-successful.html")
} else {
c.HTML(http.StatusBadRequest, "login.html", gin.H{
"ErrorTitle": "Login Failed",
"ErrorMessage": "Invalid credentials provided",
})
}
}
我的模板就像
{{ if .is_logged_in }}
<li><a href="/article/create">Create Article</a></li>
{{ end }}
{{ if not .is_logged_in }}
<li><a href="/u/register">Register</a></li>
{{end}}
但是最后,模板中的此变量似乎不起作用,仅第二部分显示,第一个链接“ Create Article”始终隐藏。
更新
我将处理函数更改为类似的内容
render(c, gin.H{"title": "Successful Login", "is_logged_in": c.MustGet("is_logged_in").(bool)}, "login-successful.html")
明确传递变量。现在,模板元素的隐藏和显示是正确的。那么Golang或Gin中有什么变化可以使.Set()
的行为有所不同?
答案 0 :(得分:0)
您是否首先加载模板?
func main() {
router := gin.Default()
router.LoadHTMLGlob("templates/*")
//router.LoadHTMLFiles("templates/template1.html", "templates/template2.html")
router.GET("/index", func(c *gin.Context) {
c.HTML(http.StatusOK, "index.tmpl", gin.H{
"title": "Main website",
})
})
router.Run(":8080")
} templates / index.tmpl
<html>
<h1>
{{ .title }}
</h1>