与这个question相关的,我有一些Golang代码here,目前localhost:8080/search-availability
渲染正常,其内容如下:
如果我将templates\search-availability.page.tmpl
的第13行改为:
<input type="text" name="csrf_token" value="{{.CsrfToken}}">
转换为:
<input type="text" name="csrf_token" value="{{.WrongToken}}">
任何低于Search for Availability
的值都将消失。
为了调试另一个问题中提到的问题,我想在pkg\models\templatedata.go
中进行重命名:
type TemplateData struct {
StringMap map[string]string
IntMap map[string]int
FloatMap map[string]float64
Data map[string]interface{}
// CsrfToken string
Token string
Flash string
Error string
}
基本上,CsrfToken
被缩短为Token
。为了适应这种变化,templates\search-availability.page.tmpl
的第13行被修改为:
<!-- <input type="text" name="csrf_token" value="{{.CsrfToken}}"> -->
<input type="text" name="csrf_token" value="{{.Token}}">
(我只注解掉旧值,稍后会更清楚)因此,pkg\render\render.go
做了如下更改:
func AddDefaultData(td *models.TemplateData, r *http.Request) *models.TemplateData {
// td.CsrfToken = nosurf.Token(r)
fmt.Printf("Token before: %s\n", td.Token)
td.Token = nosurf.Token(r)
fmt.Printf("Token after: %s\n", td.Token)
return td
}
然后我运行go run ./cmd/web/*.go
看看它是否工作,令人惊讶的是,Search for Availability
下面的所有内容都不见了,这是终端的输出:
Starting a server on port :8080
2023/03/12 23:54:46 SessionLoad
2023/03/12 23:54:46 NoSurf
2023/03/12 23:54:47 Hit the page
2023/03/12 23:54:47 Availability
Token before:
Token after: ERyPRtSgyVxmtthfMD49BsysXczubQfn7SQ3+L0ntc+6PQoHlaykAYejIa6Vw4m4omkgO94tVi/YiD0baSz2yw==
VS Code
代码完成可以拾取td.Token
,并且终端显示该变量存在。为什么它的行为与使用WrongToken
时一样?删除这两行将返回Arrival
及以下内容:
<!-- <input type="text" name="csrf_token" value="{{.CsrfToken}}"> -->
<input type="text" name="csrf_token" value="{{.Token}}">
我在这里不知所措。为什么会发生这种情况?任何见解都非常感谢。
1条答案
按热度按时间rt4zxlrg1#
HTML注解中的模板表达式仍然会被计算。不存在的字段的存在将导致
Execute()
停止并返回错误。或者,您可以使用模板注解(参见text/template文档中操作列表的第一个条目),这将导致在执行模板时丢弃所包含的内容。
这里有一个小例子来说明:
输出:
Go Playground