为了账号安全,请及时绑定邮箱和手机立即绑定

Gorilla web 工具包:len(session.Flashes()) 为 0

Gorilla web 工具包:len(session.Flashes()) 为 0

Go
叮当猫咪 2021-11-01 16:44:26
我有一个注册表格,我想用简单的逻辑放在一起,我在服务器端用简单的 ifs 检查了表单验证,例如if username == "" || < 5 {    session.AddFlash("Username is too short")    session.Save(r, w)}这工作正常然后在我做的验证结束时(用于调试目的)fmt.Println(len(session.Flashes())) which returns 3然后我检查是否有像这样的任何形式错误if len(session.Flashes()) != 0 {    // Perform Redirect and show flashes} else {    // Set proper session variables and log user in}那么,3 > 0为什么else触发语句而不是 if 语句的第一部分呢?我只是不确定为什么会这样。谢谢,如果您需要更多信息,请告诉我,实际代码片段:if username == "" || len(username) < 4 {    session.AddFlash("Username is too short")    session.Save(r, w)}if email == "" || len(email) < 5 {    session.AddFlash("Email is too short")    session.Save(r, w)}if firstname == "" || len(firstname) < 3 {    session.AddFlash("Firstname is too short")    session.Save(r, w)}if lastname == "" || len(lastname) < 3 {    session.AddFlash("Lastname is too short")    session.Save(r, w)}fmt.Println(len(session.Flashes()) > 0) // trueif len(session.Flashes()) != 0 {    fmt.Println("Why am I here also")    type Page struct {        Title    string        Username interface{}        Errors   []interface{}    }    session, _ := common.GetSession(r)    data := &Page{"Register", session.Values["username"], session.Flashes()}    session.Save(r, w)    tmpl, err := template.ParseFiles("views/register/register.html")    if err != nil {        http.Error(w, "Failed to load page.", 500)    }    tmpl.ExecuteTemplate(w, "register", data)} else {    fmt.Println("Why am I here")    _, err := db.Query("// Perform DB Query")    if err != nil {        http.Error(w, "Sorry we had trouble saving your account to the database, try again in a bit.", 500)    }    session.Values["username"] = r.FormValue("username")    session.Values["authenticated"] = true    session.Save(r, w)    http.Redirect(w, r, "/", 303)}
查看完整描述

1 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

它没有很好的记录,但显然从会话中Flashes 删除了闪烁并返回它们:


func (s *Session) Flashes(vars ...string) []interface{} {

    var flashes []interface{}

    key := flashesKey

    if len(vars) > 0 {

        key = vars[0]

    }

    if v, ok := s.Values[key]; ok {

        // Drop the flashes and return it.

        delete(s.Values, key)

        flashes = v.([]interface{})

    }

    return flashes

}

源代码在这里。


这里的解决方案是使用单独的变量来保存验证状态:


valid := true

if username == "" || len(username) < 4 {

    valid = false

    session.AddFlash("Username is too short")

    session.Save(r, w)

}

// ...

if !valid {

    // ...

} else {

    // ...

}

编辑:另一种获取闪光灯而不删除它们的方法是Values直接从以下位置获取它们:


flashes := session.Values["_flash"].([]interface{})


查看完整回答
反对 回复 2021-11-01
  • 1 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信