Как использовать Gorilla Sessions в Golang в разных пакетах - PullRequest
0 голосов
/ 03 января 2019

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

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

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

1 Ответ

0 голосов
/ 03 января 2019

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

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, чтобы он нигде не зависел, за исключением вашего собственного пакета сессий.

...