Как использовать Gorilla Sessions в Golang в разных пакетах

У меня есть основной пакет (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")
  ...

Как я могу получить значение сеанса из другого пакета? Или я должен передать его своему обработчику (если да, то как это сделать?).

Я новичок в Голанге. Пожалуйста помоги.


person Rattrap    schedule 03.01.2019    source источник


Ответы (1)


Обычно я оборачиваю свои зависимости в их собственный пакет, что позволяет мне абстрагироваться от некоторых обычных вещей, которые я делаю. Для сеансов я обычно использую одно и то же имя сеанса большую часть времени, поэтому обычно у меня было что-то вроде этого:

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)
}

Еще лучше было бы вернуть только какой-то interface из сеансов и полностью обернуть gorilla/sessions, чтобы он не зависел от него нигде, кроме вашего собственного пакета сеансов.

person dave    schedule 03.01.2019
comment
+1 это кажется хорошим способом изолировать реализацию, а также отделить зависимость от базового пакета управления сеансом, который используется в приложении. - person Gayan Hewa; 04.01.2019