首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大猩猩网络下载工具包: len(session.Flashes())为0

大猩猩网络下载工具包: len(session.Flashes())为0
EN

Stack Overflow用户
提问于 2015-08-26 06:23:51
回答 1查看 215关注 0票数 0

我有一个注册表单,我试图把它放在一起,用简单的逻辑在服务器端用简单的ifs检查表单验证。

代码语言:javascript
复制
if username == "" || < 5 {
    session.AddFlash("Username is too short")
    session.Save(r, w)
}

在我所做的验证结束时(为了调试目的),这是很好的。

代码语言:javascript
复制
fmt.Println(len(session.Flashes())) which returns 3

然后我检查是否有类似的形式错误。

代码语言:javascript
复制
if len(session.Flashes()) != 0 {
    // Perform Redirect and show flashes
} else {
    // Set proper session variables and log user in
}

那么,如果是3 > 0,为什么要触发else语句而不是if语句的第一部分?我只是不知道为什么会这样。如果您还需要更多的信息,请告诉我,实际的代码片段:

代码语言:javascript
复制
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) // true

if 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)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-26 06:32:44

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

代码语言:javascript
复制
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
}

源代码这里

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

代码语言:javascript
复制
valid := true
if username == "" || len(username) < 4 {
    valid = false
    session.AddFlash("Username is too short")
    session.Save(r, w)
}
// ...
if !valid {
    // ...
} else {
    // ...
}

编辑:获得闪存而不删除它们的另一种方法是直接从Values获取它们:

代码语言:javascript
复制
flashes := session.Values["_flash"].([]interface{})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32219364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档