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

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

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

Go
慕虎7371278 2021-07-02 16:03:33
从逻辑的角度来看,我试图在重定向之间保留部分表单数据以获得更好的用户体验,这样用户就不必再次填写整个表单,只需填写无效的部分。从编程的角度来看,我试图在 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”,如果这可能对这种行为有任何影响。请记住,我成功地在重定向后设法检索了“消息”,唯一的问题是结构数据。我做错了什么,或者是否有另一种方法可以在重定向后填写我不知道的部分表单?
查看完整描述

1 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

您的问题是您正在使用 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。


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

添加回答

举报

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