Использование контекста запроса в шаблонах 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