Session 如何在不同包中使用Golang中的Gorilla会话

Session 如何在不同包中使用Golang中的Gorilla会话,session,go,gorilla,Session,Go,Gorilla,我有主包(main.go): 我还有另一个包(index.go): 如何从另一个包中获取会话值?或者我应该把它交给我的处理者(如果是,怎么做?) 我是刚来戈兰的。请帮忙。我通常将依赖项包装在自己的包中,让我抽象掉一些常见的事情。对于会话,我通常在大多数情况下使用相同的会话名称,因此我通常会使用如下内容: package sessions import ( "os" gsessions "github.com/gorilla/sessions" ) var store = gs

我有主包(main.go):

我还有另一个包(index.go):

如何从另一个包中获取会话值?或者我应该把它交给我的处理者(如果是,怎么做?)


我是刚来戈兰的。请帮忙。

我通常将依赖项包装在自己的包中,让我抽象掉一些常见的事情。对于会话,我通常在大多数情况下使用相同的会话名称,因此我通常会使用如下内容:

package sessions

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

var store = gsessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY")))

func Get(req *http.Request) (*gsessions.Session, error) {
    return store.Get(req, "default-session-name")
}

func GetNamed(req *http.Request, name string) (*gsessions.Session, error) {
    return store.Get(req, name)
}
然后,您可以在任何其他地方导入自己的会话包:

import (
    "net/http"
    "github.com/yourpackage/sessions"
)

func Index(rw http.ResponseWriter, r *http.Request) {
    session, err := sessions.Get(r)
    if err != nil {
        panic(err)
    }
    session.Values["test"] = "test"
    session.Save(r, rw)
}

更好的做法是只从会话返回某种类型的
接口
,并完全包装
gorilla/sessions
,这样除了您自己的会话包之外,其他任何地方都不会依赖它。

我通常将依赖项包装在自己的包中,这样我就可以抽象掉一些我做的常见事情。对于会话,我通常在大多数情况下使用相同的会话名称,因此我通常会使用如下内容:

package sessions

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

var store = gsessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY")))

func Get(req *http.Request) (*gsessions.Session, error) {
    return store.Get(req, "default-session-name")
}

func GetNamed(req *http.Request, name string) (*gsessions.Session, error) {
    return store.Get(req, name)
}
然后,您可以在任何其他地方导入自己的会话包:

import (
    "net/http"
    "github.com/yourpackage/sessions"
)

func Index(rw http.ResponseWriter, r *http.Request) {
    session, err := sessions.Get(r)
    if err != nil {
        panic(err)
    }
    session.Values["test"] = "test"
    session.Save(r, rw)
}

更好的做法是只从会话返回某种类型的
接口
,并完全包装
gorilla/sessions
,这样除了您自己的会话包之外,任何地方都不依赖它。

+1这似乎是隔离实现的好方法,并且还将依赖关系解耦到应用程序中使用的底层会话管理包。+1这似乎是隔离实现的一个好方法,并且还将依赖关系解耦到应用程序中使用的底层会话管理包。