Сеанс Gorilla.AddFlash не добавляет флэш-сообщение

У меня есть страница регистрации с двумя обработчиками: один для отображения формы, другой для обработки отправки формы.

Я пытаюсь использовать метод session.AddFlash, чтобы сохранить ошибку, затем выполнить перенаправление 302 обратно в регистрационную форму и отобразить ошибку.

Я настроил хранилище сеансов:

package web

import (
    "github.com/gorilla/sessions"
)

var sessionStore = sessions.NewCookieStore([]byte(sessionSecret))

Тогда мои обработчики выглядят так:

package web

import (
    "html/template"
    "log"
    "net/http"
)

func registerForm(w http.ResponseWriter, r *http.Request) {
    session, err := sessionStore.Get(r, "mysession")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    data := map[string]interface{}{}
    log.Print("Flashes: ")
    log.Print(session.Flashes())
    if flashes := session.Flashes(); len(flashes) > 0 {
        data["error"] = flashes[0]
    }

    tmpl, _ := template.ParseFiles("web/templates/register.html.tmpl")
    tmpl.Execute(w, data)
}

func register(w http.ResponseWriter, r *http.Request) {
    session, err := sessionStore.Get(r, "mysession")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    r.ParseForm()
    username := r.Form["username"][0]
    password := r.Form["password"][0]

    if UserExists(username) {
        log.Print("Username already taken")
        session.AddFlash("Username already taken")
        http.Redirect(w, r, "/web/register", http.StatusFound)
        return
    }

    _, err = CreateUser(username, password)
    log.Print(err)

    if err != nil {
        session.AddFlash(err.Error())
        http.Redirect(w, r, "/web/register", http.StatusFound)
        return
    }

    http.Redirect(w, r, "/web/login", http.StatusFound)
}

Добавляя журналы, я вижу, что UserExists возвращает true, поэтому следует добавить флэш-сообщение, однако после перенаправления в обработчик формы в сеансе не сохраняется флэш-сообщение.


person Richard Knop    schedule 12.11.2015    source источник
comment
Из приведенного выше кода метод AddFlash используется дважды один раз внутри, если UserExists и 2-й внутри, если ошибка не равна нулю.... AddFlash внутри UserExists будет выполняться в случае, если UserExists возвращает true... поскольку вы упомянули, что UserExists возвращает false.. ...AddFlash внутри, если не будет вызываться....   -  person Prashant Thakkar    schedule 12.11.2015


Ответы (1)


Я думаю, вам нужно сохранить сеанс, прежде чем перенаправить.

session.Save(r, w)

http://www.gorillatoolkit.org/pkg/sessions#Session.Save

person Yannick    schedule 12.11.2015