Golang gorilla 会话在重定向后保留表单数据

从逻辑的角度来看,我试图在重定向之间保留部分表单数据以获得更好的用户体验,这样用户就不必再次填写整个表单,只需填写无效的部分。


从编程的角度来看,我试图在 gorilla session 的 flash 中保存 request.PostForm 数据结构。重定向后我唯一设法检索的是内存地址的字符串表示,如[0xc2001c8b10]。


这是我在验证错误后保存 flashes 数据的部分(在此之前执行了 request.ParseForm()):


session, _ := store.Get(request, "test")

session.AddFlash(err.Error(), "messages")

session.AddFlash(request.PostForm, "form_data")

session.Save(request, response)

http.Redirect(response, request, "/", http.StatusFound)

return

我也试过用 gob 注册结构没有效果:


func init() {

    gob.Register(&url.Values{})

}

表单值是小写的,例如。“first_name”、“last_name”,如果这可能对这种行为有任何影响。


请记住,我成功地在重定向后设法检索了“消息”,唯一的问题是结构数据。


我做错了什么,或者是否有另一种方法可以在重定向后填写我不知道的部分表单?


慕虎7371278
浏览 184回答 1
1回答

白衣非少年

您的问题是您正在使用 type 的值interface{},这是泛型类型,并且在可能有多个类型时使用。这就是 gorillasession.Flashes() 方法的情况,因为它可以返回任意用户数据(无论您输入什么)。您可以使用此代码(播放中)重现您遇到的情况:type MyData struct {    X int}// Simulate Flashes() from gorilla, which returns a slice of interface{} values.func Flashes() []interface{} {    x := &MyData{2}    // Convert x to type interface{}    interfaceValue := interface{}(x)    // Put converted x into a slice of type []interface{}    return []interface{}{interfaceValue}}func main() {    // See that [0xSOMETHING] is printed    fmt.Println("Some data:", Flashes())}运行此程序时,您将看到如下输出:一些数据:[0xc010000000]这与您正在经历的相同。这样做的原因是,fmt.Println除非您告诉它打印所有内容,否则它不会逐步遍历指针和接口的所有抽象级别并在某个级别停止。所以如果你使用fmt.Printf("Some data: %#v\n", Flashes())您确实会看到您的数据:一些数据:[]interface {}{(*main.MyData)(0xc010000000)}访问数据所要做的就是将结果数据与您期望的类型相匹配。你必须做一个类型断言(播放示例):func main() {    value := Flashes()[0]    v, ok := value.(*MyData)    if ok {        fmt.Println("Some data:", v)    } else {        fmt.Println("Oh no, there's something else stored than expected")    }}在上面的例子中,返回的第一个 flashFlashes()被使用并被断言为类型*MyData。如果确实是这种类型,则将其值打印到控制台。否则,将在控制台上打印一条错误消息(尽管不是很好的消息)。在断言某个类型的变量之后,断言的值就是断言的类型。那就是v上面例子中的 类型*MyType。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go