如何使用 Revel / Golang 从控制器设置持久性全局模板变量
How do I set a persistent global template variable from the controller using Revel / Golang
我是 Golang 的新手,我正在从 Node.js 服务器切换到 Golang 服务器,我正在尝试重写我之前为 Node 编写的应用程序。
我想在用户登录时设置模板变量,但我不确定如何设置,是的,我已经尝试使用谷歌搜索了。
这是我的注册用户控制器:
func (c User) RegisterUser(user_email, user_password,
user_password_confirmation, user_first_name,
user_last_name string) revel.Result {
// Validate Email
c.Validation.Required(user_email).Message("Username is required")
c.Validation.Email(user_email).Message("Email is not a valid email")
c.Validation.MinSize(user_email, 5).Message("Email must be greater than 5 characters")
// Validate Password
c.Validation.Required(user_password).Message("Password is required")
c.Validation.MinSize(user_password, 5).Message("Password must be greater than 5 characters.")
// Validate Password Confirmation
c.Validation.Required(user_password_confirmation).Message("Password Confirmation is required")
c.Validation.MinSize(user_password_confirmation, 5).Message("Password must be greater than 5 characters.")
c.Validation.Required(user_password == user_password_confirmation).Message("Your passwords do not match")
// Validate First Name
c.Validation.Required(user_first_name).Message("First Name is required")
c.Validation.MinSize(user_first_name, 3).Message("Your First Name must be greater than 3 characters")
// Validate Last Name
c.Validation.Required(user_last_name).Message("Last Name is required")
c.Validation.MinSize(user_last_name, 3).Message("Your Last Name must be greater than 3 characters")
// If anything wasn't right, set flash and display errors to user
if c.Validation.HasErrors() {
c.Validation.Keep()
c.FlashParams()
return c.Redirect(User.Register)
}
// Hash The Users Password
password := []byte(user_password_confirmation)
hashedPassword, err := bcrypt.GenerateFromPassword(password, 10)
if err != nil {
c.Flash.Error("Invalid Username or Password Combination")
return c.Redirect(User.Register)
}
// Connect to database
db, err := sql.Open("mysql", "root:******@/WebRTC")
if err != nil {
c.Flash.Error("Unable to connect to database. Try again later!")
return c.Redirect(User.Register)
}
defer db.Close()
// Ping the database, ensure there is a connection
err = db.Ping()
if err != nil {
c.Flash.Error("Unable to connect to database. Try again later!")
return c.Redirect(User.Register)
}
// Prepare SQL Statement for Security
stmtIns, err := db.Prepare("INSERT INTO users (user_email, user_first_name, user_last_name, " +
"user_password_hash, user_created_at, user_created_ip, user_last_ip) VALUES (?, ?, ?, ?, ?, ?, ?)")
if err != nil {
c.Flash.Error("Unable to Register you. Please try again later")
return c.Redirect(User.Register)
}
defer stmtIns.Close()
// Insert Data into Database
_, err = stmtIns.Exec(user_email, user_first_name, user_last_name, hashedPassword,
time.Now().Local(), c.Request.RemoteAddr, c.Request.RemoteAddr)
if err != nil {
c.Flash.Error("Unable to register you. Please try again later")
return c.Redirect(User.Register)
}
// Here I want to add the global template variable
return c.Redirect(User.Register)
}
我读过有关 c.RenderArgs
的内容,但它似乎无法满足我的要求。
我希望能够设置用户的用户名,以便我可以在导航栏中显示它,让他们知道他们已经登录。
如果您正在使用 c.RenderArgs
,那么您的方向是对的,除非我误解了您的意图。
这里有一个示例(或者更确切地说,一个演练),说明您可以如何使用它(取自 Revel 的 booking sample app):
init.go: Register an interceptor 在执行操作之前添加用户信息(AddUser
将在 Render
之前触发)。
app.go: 检查用户是否已连接,如果是,则将用户数据存储在 RenderArgs
映射中,如下所示:
c.RenderArgs["user"] = user
第 31 行处理 model。
header.html:传入用户名模板变量。
希望对您有所帮助。
编辑:我应该补充一点,用户的用户名是 stored in a session upon login. It's used to retrieve more information。
我是 Golang 的新手,我正在从 Node.js 服务器切换到 Golang 服务器,我正在尝试重写我之前为 Node 编写的应用程序。
我想在用户登录时设置模板变量,但我不确定如何设置,是的,我已经尝试使用谷歌搜索了。
这是我的注册用户控制器:
func (c User) RegisterUser(user_email, user_password,
user_password_confirmation, user_first_name,
user_last_name string) revel.Result {
// Validate Email
c.Validation.Required(user_email).Message("Username is required")
c.Validation.Email(user_email).Message("Email is not a valid email")
c.Validation.MinSize(user_email, 5).Message("Email must be greater than 5 characters")
// Validate Password
c.Validation.Required(user_password).Message("Password is required")
c.Validation.MinSize(user_password, 5).Message("Password must be greater than 5 characters.")
// Validate Password Confirmation
c.Validation.Required(user_password_confirmation).Message("Password Confirmation is required")
c.Validation.MinSize(user_password_confirmation, 5).Message("Password must be greater than 5 characters.")
c.Validation.Required(user_password == user_password_confirmation).Message("Your passwords do not match")
// Validate First Name
c.Validation.Required(user_first_name).Message("First Name is required")
c.Validation.MinSize(user_first_name, 3).Message("Your First Name must be greater than 3 characters")
// Validate Last Name
c.Validation.Required(user_last_name).Message("Last Name is required")
c.Validation.MinSize(user_last_name, 3).Message("Your Last Name must be greater than 3 characters")
// If anything wasn't right, set flash and display errors to user
if c.Validation.HasErrors() {
c.Validation.Keep()
c.FlashParams()
return c.Redirect(User.Register)
}
// Hash The Users Password
password := []byte(user_password_confirmation)
hashedPassword, err := bcrypt.GenerateFromPassword(password, 10)
if err != nil {
c.Flash.Error("Invalid Username or Password Combination")
return c.Redirect(User.Register)
}
// Connect to database
db, err := sql.Open("mysql", "root:******@/WebRTC")
if err != nil {
c.Flash.Error("Unable to connect to database. Try again later!")
return c.Redirect(User.Register)
}
defer db.Close()
// Ping the database, ensure there is a connection
err = db.Ping()
if err != nil {
c.Flash.Error("Unable to connect to database. Try again later!")
return c.Redirect(User.Register)
}
// Prepare SQL Statement for Security
stmtIns, err := db.Prepare("INSERT INTO users (user_email, user_first_name, user_last_name, " +
"user_password_hash, user_created_at, user_created_ip, user_last_ip) VALUES (?, ?, ?, ?, ?, ?, ?)")
if err != nil {
c.Flash.Error("Unable to Register you. Please try again later")
return c.Redirect(User.Register)
}
defer stmtIns.Close()
// Insert Data into Database
_, err = stmtIns.Exec(user_email, user_first_name, user_last_name, hashedPassword,
time.Now().Local(), c.Request.RemoteAddr, c.Request.RemoteAddr)
if err != nil {
c.Flash.Error("Unable to register you. Please try again later")
return c.Redirect(User.Register)
}
// Here I want to add the global template variable
return c.Redirect(User.Register)
}
我读过有关 c.RenderArgs
的内容,但它似乎无法满足我的要求。
我希望能够设置用户的用户名,以便我可以在导航栏中显示它,让他们知道他们已经登录。
如果您正在使用 c.RenderArgs
,那么您的方向是对的,除非我误解了您的意图。
这里有一个示例(或者更确切地说,一个演练),说明您可以如何使用它(取自 Revel 的 booking sample app):
init.go: Register an interceptor 在执行操作之前添加用户信息(
AddUser
将在Render
之前触发)。app.go: 检查用户是否已连接,如果是,则将用户数据存储在
RenderArgs
映射中,如下所示:
c.RenderArgs["user"] = user
第 31 行处理 model。
header.html:传入用户名模板变量。
希望对您有所帮助。
编辑:我应该补充一点,用户的用户名是 stored in a session upon login. It's used to retrieve more information。