在Go模板中使用请求上下文
在Go模板中,您可能会遇到需要从触发请求中访问信息的情况,例如判断当前用户是否是管理员。然而,模板缺乏对请求上下文的固有感知。
解决方案:管道
一种常见的方法是使用管道将必要的数据从处理程序传递到模板。这涉及创建一个包含相关上下文信息的管道变量,然后在模板中访问它。例如:
type TemplateData struct {
IsUserAdmin bool
}
func handler(w http.ResponseWriter, r *http.Request) {
isUserAdmin := isAdmin(r)
data := TemplateData{IsUserAdmin: isUserAdmin}
t.Execute(w, data)
}
模板内:
{{if .IsUserAdmin}} Go to the big red nuclear button {{end}}
嵌入上下文
另一个选项是将请求上下文嵌入到自定义模板数据结构中。这允许您同时访问模板数据和上下文:
type TemplateData struct {
Data interface{}
Context *http.Request
}
模板内:
{{if .Context.IsAdmin}} Go to the big red nuclear button {{end}}
Funnel 方法
虽然 Funcs 方法可用于定义自定义函数,但不建议用于处理确定用户权限等复杂逻辑。最好将此类任务保留在处理程序或控制器中。
最佳实践
通常,限制模板处理显示逻辑并避免引入业务逻辑被认为是最佳实践或请求上下文依赖关系。然而,在某些情况下,可能需要访问特定的请求信息,因此采用上述方法。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3