标签: gorilla

大猩猩/背景与大猩猩/会话有何不同?

我从以前的PHP获得会话

<?php
session_start();
$_SESSION["key"] = "val";
echo $_SESSION["key"];
?>
Run Code Online (Sandbox Code Playgroud)

在服务器端设置一个或多个密钥及其值,并能够检索或覆盖它,直到会话到期为止.

与大猩猩/会话相同

var(
    sessionStore  *sessions.CookieStore
    sessionSecret []byte = make([]byte, 64)
    session       *sessions.Session
)

func init(){
    sessionSecret = []byte("12345678901234567890123456789012")
    sessionStore = sessions.NewCookieStore(sessionSecret)
    session = sessions.NewSession(sessionStore, "session_name")
}

func SetSessionHandler(w http.ResponseWriter, r *http.Request) {
    session, _ = sessionStore.Get(r, "session_name")
    session.Values["key"] = "val"
    session.Save(r, w)
}

func GetSessionHandler(w http.ResponseWriter, r *http.Request) {
    session, _ = sessionStore.Get(r, "session_name")
    fmt.FPrintln(session.Values["key"])
}
Run Code Online (Sandbox Code Playgroud)

现在我不明白大猩猩/背景的意义.我知道背景是什么但是......我不知道它是如何适应大局的.它说它受当前请求的约束.stackoverflow上的另一个问题是,在编写Per-Handler中间件的上下文中"简单地使用gorilla/context应该就足够了" .

但如果它的请求绑定...错误..语法错误,不计算.如果鸭子浮在水面上,那么巫婆就是用木头做的.因为如果她的重量与鸭子的重量相同,鸭子也漂浮在水面上,她必须是女巫.或类似的东西 ;)

当它受到请求约束时,它如何作为中间件"管理器"有用,我无法在全局设置它.您是否可以展示如何将大猩猩/会话与大猩猩/上下文一起使用的示例?

go gorilla

9
推荐指数
1
解决办法
2956
查看次数

使用Gorilla会话自定义后端有什么好处?

我想使用Redis进行会话管理.
但我无法弄清楚使用Redis作为Gorilla会话包的自定义后端直接使用它的优势是什么?

链接到Gorilla会话包:http://www.gorillatoolkit.org/pkg/sessions

go session-cookies redis gorilla

9
推荐指数
1
解决办法
2554
查看次数

Golang 中使用 gorilla/mux 的静态文件服务器

我制作了一个应用程序,我需要将相同的文件提供给多个路由,因为前端是一个 React 应用程序。我一直在为路由器使用大猩猩复用器。文件结构如下:

main.go
build/
  | index.html
  | service-worker.js
     static/
       |  js/
           | main.js
       |  css/
           | main.css
Run Code Online (Sandbox Code Playgroud)

这些文件假定它们位于文件目录的根目录中。所以在 html 文件中,他们被要求像'/static/js/main.js'。

在主要我的路线定义如下:

r.PathPrefix("/student").Handler(http.StripPrefix("/student",http.FileServer(http.Dir("build/")))).Methods("GET")
r.PathPrefix("/").Handler(http.FileServer(http.Dir("build/"))).Methods("GET")
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我可以在 '/' 和 '/student' 路由中获得 index.html 文件。如果我将它们放在“/student”路径的另一侧,则会出现 404 错误。所以我要问的是,是否有另一种方法可以为这两个路由提供相同的内容,以便我不必为我将在我的 Web 应用程序中拥有的每个视图定义一个路由。

routing go gorilla

8
推荐指数
1
解决办法
5176
查看次数

去,sudo和apache端口80

我在golang中使用gorilla/mux包,但是有一些问题.第一个是我没有权限在我的应用程序上使用端口80,因为我无法从sudo运行应用程序,因为$GOPATH在使用sudo时没有设置.

这是我从程序中得到的错误:

$ go run app.go 
2014/06/28 00:34:12 Listening...
2014/06/28 00:34:12 ListenAndServe: listen tcp :80: bind: permission denied
exit status 1
Run Code Online (Sandbox Code Playgroud)

我不确定当我修复sudo问题时它是否会工作,因为apache已经在使用端口80而且我不确定我的应用程序和apache是​​否可以"一起玩得很好".

关于如何解决这个问题的任何建议都会很棒.谢谢.

linux apache go gorilla

7
推荐指数
1
解决办法
1万
查看次数

大猩猩websocket与cookie身份验证

这是我的设置:我正在使用用户登录构建服务(使用Negroni和Gorilla),在登录时,用户获取会话cookie,服务器使用该cookie来授权受保护的端点.其中一个受保护的端点允许用户/客户端使用服务器打开websocket,如下所示:

app := negroni.New()

r := mux.NewRouter()

r.HandleFunc("/auth/connection", func(rw http.ResponseWriter, req *http.Request) {
    // authorize request using req.Cookie("session_id")

    // create websocket
    conn, err := upgrader.Upgrade(rw, req, nil)
    if err != nil {
        panic(err)
    }
    defer conn.Close()

    // do stuff...
})

app.UseHandler(r)

app.Run(":3000")
Run Code Online (Sandbox Code Playgroud)

但是,req.Cookies()总是空的,这意味着我不能授权任何请求"/auth/connection"- 而且我几乎肯定它不是websocket客户端的问题(如果你很好奇,我正在使用这个Python包测试它:https ://github.com/liris/websocket-client).我是否正确接近websocket的身份验证?

任何帮助/建议将不胜感激!

cookies go websocket gorilla

7
推荐指数
1
解决办法
2125
查看次数

将背景传递给大猩猩mux - 去成语

我是golang的新手,我正在尝试用最好的方式来解决这个问题.

我有一系列我静态定义和传递的路由gorilla/mux.我正在使用某些东西处理每个处理函数来处理请求和处理恐慌(主要是因为我可以理解包装是如何工作的).

我希望他们每个人都能够访问"上下文" - 一个每个http服务器一个结构,可能有数据库句柄,配置等等.我不想做的是使用静态全局变量.

我目前正在做的方式我可以给包装器访问上下文结构,但是我看不出如何将它放到实际的处理程序中,因为它希望它是一个http.HandlerFunc.我认为我能做的就是转换http.HandlerFunc成我自己的一种类型的接收器Context(并且对包装器做同样的事情,但是(经过多次玩)我无法Handler()接受这个.

我不禁想到我在这里遗漏了一些明显的东西.代码如下.

package main

import (
    "fmt"
    "github.com/gorilla/mux"
    "html"
    "log"
    "net/http"
    "time"
)

type Route struct {
    Name        string
    Method      string
    Pattern     string
    HandlerFunc http.HandlerFunc
}

type Context struct {
    route *Route
    // imagine other stuff here, like database handles, config etc.
}

type Routes []Route

var routes = Routes{
    Route{
        "Index",
        "GET",
        "/",
        index,
    },
    // imagine lots more routes here
}

func wrapLogger(inner …
Run Code Online (Sandbox Code Playgroud)

go gorilla

7
推荐指数
1
解决办法
3826
查看次数

我需要使用go lang连接到现有的websocket服务器

这是我在localhost上运行的websocket ws://localhost:8080/ws

我需要go lang代码,可以创建一个websocket客户端并连接到这个服务器.

我的Google-Fu技能未能教会我一个简单的方法.

谢谢.

go websocket gorilla

7
推荐指数
2
解决办法
1万
查看次数

Go中的Rest API - 使用net/http与像Gorilla这样的库

我看到Go本身有一个包net/http,足以提供启动和运行自己的REST API所需的一切.然而,有各种各样的框架,最流行的可能是大猩猩.

考虑到我需要做的主要事情之一是构建REST API,它通常会访问一些后端存储(数据库,缓存等)以执行CRUD操作,是否适合使用Go的标准库本身或者我应该考虑使用一些框架?

通常,人们编写新的库或框架来解决现有库中存在的问题.但是,当实际需求很简单时,许多框架也会使事情变得更糟.

所以我几乎没有问题:

  1. go lang中的基本库是否足以支持REST的基本到中等功能?

  2. 如果我最终使用内置库并且明天必须改变它以使用某些框架(如大猩猩)那么努力将是多么困难/昂贵?

  3. 框架是真正解决问题还是只是简单地解决问题?

我非常感谢有人在这里分享他的想法(他自己做出这个选择),而我更多地研究自己的想法.

rest go net-http gorilla

7
推荐指数
2
解决办法
2478
查看次数

Golang gorilla WebSocket 包中如何保证并发

我研究过gorilla/websocket包的godoc。

在 Godoc 中明确指出,

并发连接支持一个并发读取器和一个并发写入器。

应用程序负责确保不超过一个 goroutine 同时调用写入方法(NextWriter、SetWriteDeadline、WriteMessage、WriteJSON、EnableWriteCompression、SetCompressionLevel),并且不超过一个 goroutine 调用读取方法(NextReader、SetReadDeadline、ReadMessage、ReadJSON、SetPongHandler) , SetPingHandler) 并发。

Close 和 WriteControl 方法可以与所有其他方法同时调用。

但是,在包提供的示例之一中

func (c *Conn) readPump() {
    defer func() {
        hub.unregister <- c
        c.ws.Close()
    }()
    c.ws.SetReadLimit(maxMessageSize)
    c.ws.SetReadDeadline(time.Now().Add(pongWait))
    c.ws.SetPongHandler(func(string) error { 
        c.ws.SetReadDeadline(time.Now().Add(pongWait)); return nil
    })
    for {
        _, message, err := c.ws.ReadMessage()
        if err != nil {
            if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) {
                log.Printf("error: %v", err)
            }
            break
        }
        message = bytes.TrimSpace(bytes.Replace(message, newline, space, -1))
        hub.broadcast <- message
    }
}
Run Code Online (Sandbox Code Playgroud)

来源:https : //github.com/gorilla/websocket/blob/a68708917c6a4f06314ab4e52493cc61359c9d42/examples/chat/conn.go#L50

这条线

c.ws.SetPongHandler(func(string) error …
Run Code Online (Sandbox Code Playgroud)

go websocket gorilla

7
推荐指数
1
解决办法
4655
查看次数

如何在登录时将会话数据存储在 chi 路由器上下文中

在 Golang 应用程序中,我使用 gorilla/sessions 和 mySQL 后端在会话中存储数据,但我想将数据存储在 chi 路由器上下文中。如何将身份验证令牌字符串或结构添加到上下文中?我看到很多示例解释如何读取/使用它们,但我看到没有一个示例解释如何将数据插入登录函数中的上下文中。

例如,这里的chi 文档有以下代码来检查管理员用户,这对我有用,但它没有提供有关 auth 对象首先如何进入上下文的线索。还有另一个中间件函数描述如何将文章结构加载到上下文中并从 URL 获取其 id 参数,但这对我不起作用。我真的不想使用 cookie,因为这会破坏使用上下文的整个目的。

// AdminOnly middleware restricts access to just administrators.
func AdminOnly(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        isAdmin, ok := r.Context().Value("acl.admin").(bool)
        if !ok || !isAdmin {
            http.Error(w, http.StatusText(http.StatusForbidden), http.StatusForbidden)
            return
        }
        next.ServeHTTP(w, r)
    })
}
Run Code Online (Sandbox Code Playgroud)

在下面的示例中,我想在上下文中存储用户结构或身份验证令牌。

此外,我将如何处理上下文中的闪烁?我可以这样做还是应该坚持使用基于数据库的 Web 应用程序会话?

理想情况下,我想对服务模板的 Web 应用程序和单独的 API 应用程序使用相同的方法。

这是我的网络应用程序登录代码,进行了一些简化以消除繁琐的内容:

func (rs *appResource) login(w http.ResponseWriter, r *http.Request) {

// appResource contains db connection, …
Run Code Online (Sandbox Code Playgroud)

go gorilla

7
推荐指数
1
解决办法
7851
查看次数

标签 统计

go ×10

gorilla ×10

websocket ×3

apache ×1

cookies ×1

linux ×1

net-http ×1

redis ×1

rest ×1

routing ×1

session-cookies ×1