Пожалуйста, объясните мне этот удивительный эффект кто-нибудь.
Вот у меня код берёт из БД простую таблицу с четырьмя полями обычным запросом SELECT * FROM books,
отправляет её в заготовленную структуру, читает файл с шаблоном, парсит его и отправляет с данными в ответ клиенту, вот так (фрагмент, конечно):
for rows.Next() {
bk := new(Book)
err := rows.Scan(&bk.Isbn, &bk.Title, &bk.Author, &bk.Price)
if err != nil {
http.Error(w, http.StatusText(500), 500)
return
}
Books.Items = append(Books.Items, bk)
}
if err = rows.Err(); err != nil {
http.Error(w, http.StatusText(500), 500)
return
}
f, err := ioutil.ReadFile("file.tpl")
if err != nil {
fmt.Println(err)
}
html, err := template.New("books").Parse(string(f))
if err != nil {
fmt.Println(err)
}
w.Header().Set("Cache-Control", "no-cache")
html.Execute(w, Books)
такой шаблончик:
<body>
{{ range .Items }}
<div><b>{{ .Isbn }}</b> {{ .Title }} {{ .Author }} {{ .Price }}</div>
{{else}}
<div><strong>no rows</strong></div>
{{end}}
<br>
и благополучно выводит на странице в браузере, вот так:
Теперь если я просто обновлю страницу, то те же пять div-ов будут выведены снова, но и с прошлого запроса останутся (т.е. всего их будет 10), вот так:
если ещё раз вызову страницу, то их будет 5х3=15 и т.д.
На странице есть формочка, как видите, которой в БД можно добавить строку. Если я заполню поля и нажму кнопку - строчка в базу благополучно добавится, страница естественным образом перезагрузится, и на ней окажутся прошлые 15 (или больше) строк плюс новые теперь уже шесть (бывшие пять и добавленная строчка в таблице).
И какое, подскажите, у этого есть объяснение?
Я уже и заголовок, как можно увидеть, приписал к ответу Cache-Control - no-cache - что, конечно, ни к чему, но я не понимаю.
Новый запрос, новый ответ, новая страница - данные умножаются.
Как это? Что не так?