Go 模板中的请求上下文

Del*_*ace 5 templates go

我想在 Go HTML 模板中编写这样一个条件片段:

  {{if isUserAdmin}}
     <a href"/admin/nuke">Go to the big red nuclear button</a>
  {{end}}
Run Code Online (Sandbox Code Playgroud)

但是,这不可能直接实现,因为模板不知道触发其执行的请求,因此无法确定用户是否是管理员。

有没有一些正常的方法可以实现这一目标?

我提前指出:

  • 我不想使用管道来处理此特定数据(请参阅有关此问题的其他问题
  • 我承认只有处理程序/控制器应该处理逻辑,而视图应该只进行渲染。但条件{{if isUserAdmin}}本身并不是逻辑,它是利用控制器已经计算出的布尔值的必要构造。
  • Funcs方法可以提供帮助,但目前还不够精简,无法轻松定义特定方法isUserAdmin()

Del*_*ace 3

这是一个可行的解决方案尝试(链接到 Playground) ,在模板编译之后但每次执行之前使用Funcs覆盖"isAdmin"(感谢其他问题中的 Valentin CLement )。

但它有几个缺陷:

  • 在模板编译之前声明一个虚拟空"isAdmin"函数很奇怪。
  • 多次使用 Funcs 很痛苦,因为我不能只覆盖单个方法,我必须提供包含所有功能的完整FuncMap)编辑:实际上以前的 func 并没有丢失,我错了。
  • 它本质上不是线程安全的,并且当多个 goroutine 更改并执行同一模板时将会失败