如何在不同的包中使用 Golang 中的 Gorilla Session
How to use Gorilla Sessions in Golang in different packages
我有主包(main.go):
package main
import (
"github.com/gorilla/sessions"
...
)
func main() {
var store = sessions.NewCookieStore([]byte("secret"))
http.HandleFunc("/", routes.Index)
http.ListenAndServe(":8080", nil)
...
我还有一个包裹(index.go):
package routes
import (
"github.com/gorilla/sessions"
..
)
func Index(res http.ResponseWriter, req *http.Request) {
session, _ := store.Get(req, "session-name")
...
如何从另一个包中获取会话值?或者我应该将它传递给我的 Handler(如果是,该怎么做?)。
我是 Golang 的新手。请帮忙
我通常将我的依赖项包装在它们自己的包中,这样我就可以抽象出一些我经常做的事情。对于会话,我通常大部分时间都使用相同的会话名称,所以我通常会这样:
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)
}
更好的方法是仅 return 某种来自会话的 interface
,并完全包裹 gorilla/sessions
,这样除了您自己的之外,其他任何地方都不依赖于它会话包。
我有主包(main.go):
package main
import (
"github.com/gorilla/sessions"
...
)
func main() {
var store = sessions.NewCookieStore([]byte("secret"))
http.HandleFunc("/", routes.Index)
http.ListenAndServe(":8080", nil)
...
我还有一个包裹(index.go):
package routes
import (
"github.com/gorilla/sessions"
..
)
func Index(res http.ResponseWriter, req *http.Request) {
session, _ := store.Get(req, "session-name")
...
如何从另一个包中获取会话值?或者我应该将它传递给我的 Handler(如果是,该怎么做?)。
我是 Golang 的新手。请帮忙
我通常将我的依赖项包装在它们自己的包中,这样我就可以抽象出一些我经常做的事情。对于会话,我通常大部分时间都使用相同的会话名称,所以我通常会这样:
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)
}
更好的方法是仅 return 某种来自会话的 interface
,并完全包裹 gorilla/sessions
,这样除了您自己的之外,其他任何地方都不依赖于它会话包。