import "github.com/guregu/kami"
或import "gopkg.in/guregu/kami.v2"
Kami(神)是一个小型Web框架,使用上下文用于请求上下文和HTTPTREEMUX进行路由。它包括一个简单的系统,用于在请求之前和之后运行层次中间件,除了日志和恐慌钩。还支持通过Einhorn重新启动。
Kami旨在用作您的路线,中间软件和上下文“上帝对象”的中央注册点。鼓励您使用全球功能,但是Kami用kami.New()
支持多个Muxes。
无论您想要的地方,您都可以免费安装kami.Handler()
,但是提供了有用的kami.Serve()
函数。
这是关于卡米(Kami)诞生的演讲,并解释了一些设计选择。
支持context
和x/net/context
。
一个人为使用kami和上下文本地化问候的例子。
跳过
//我们的Webererverpackage mainimport(“ fmt”“ net/http”“ context”“ github.com/guregugu/kami”“ github.com/my-github/greeting” //请参见下面的func func enforce func engre forte func enforce forte func engre(ctx contect)。上下文,w http.ResponseWriter,r *http.request){hello:= = engering.fromcontext(ctx)名称:= kami.param(ctx,“ name”)fmt.fprintf(w,w,“%s,%s!”,你好,name) } func main(){ctx:= context.background()ctx = engering.withContext(ctx,“ hello”)//设置默认default engingkami.context = ctx //设置我们的“上帝上下文”,所有请求的基本上下文。 /hello/kami.get("/hello/:name“问候”,//添加一个带有参数的get处理程序。
//包装招呼商店在上下文中的问候设置。packageetingimport(“ net/http”“ context”“ golang.org/x/text/language”)//有关上下文的更多信息以及我们为什么这样做,//请参阅https://blog.golang.org/contexttype ctxkey intvar键ctxkey = 0Var engretings =地图[language.tag] string {language.americanenglish:“ yo”,language.japanese:“こんにちは”, } //猜猜是kami中间件,可在可能的情况下检查接受语言并将问候设置为更好的问候。 ,_,err:= language.parseacceptlanguage(r.header.get(“ accept-language”)); err == nil {for _,t:= range tag {如果g,ok:= engretings [t]; OK {ctx = with context(ctx,g)返回ctx } } } return ctx} // withContext返回带有给定的entring.func with context(ctx context.context,etching string)context.context {return context.withvalue(ctx,key,engreing)的新上下文。 } // FromContext从此上下文中检索问候,//或如果丢失(func fromContext(ctx context.context))字符串{hello,_:= ctx.value(key)。(字符串)。
使用kami.Get("/path", handler)
, kami.Post(...)
等设置路由。您可以在/hello/:name/edit
或/files/*path
中使用url中使用命名的参数或通配符并使用上下文kami为您访问: kami.Param(ctx, "name")
。请参阅路由规则和路由优先级。接受以下类型的处理程序:
实现kami.ContextHandler
的类型
func(context.Context, http.ResponseWriter, *http.Request)
实现http.Handler
类型
func(http.ResponseWriter, *http.Request)
卡米使用的所有上下文都来自kami.Context
:这是“上帝对象”和该项目的同名。默认情况下,这是context.Background()
,但请随时用适合您应用程序的原始化上下文替换它。
构建针对Google App Engine的构建将通过App Engine的每次要求上下文自动包装“上帝对象”上下文。
与kami.Use("/path", kami.Middleware)
。中间件在请求之前运行,可以尽早阻止它们。有关中间件的更多信息。
使用kami.After("/path", kami.Afterware)
添加售后软件。 AfterWare在请求后运行。
将kami.Cancel
设置为true
以自动在请求完成后自动取消所有请求的上下文。与标准库不同,Kami默认情况下不会取消上下文。
您可以通过设置kami.PanicHandler
来提供恐慌处理程序。当调用恐慌处理程序时,您可以使用kami.Exception(ctx)
访问恐慌错误。
您还可以提供一个kami.LogHandler
,它将包含每个请求。 kami.LogHandler
具有不同的函数签名,取得了可以访问响应状态代码等的Writerproxy。
使用kami.Serve()
优雅地为您的应用程序服务,或者在方便的地方使用kami.Handler()
。
类型中间件弹性(context.Context,http.ResponseWriter, *http.request)context.context
中间件与手写型不同,因为它返回了新的上下文。您可以利用这一点来通过在资助路径上注册中间件来构建上下文。作为一种特殊情况,您可以将零返回中间件链的停止执行。
中间件是分层的。例如, /hello/greg
的请求将按照以下路径注册的中间件,按顺序注册:
/
/hello/
/hello/greg
在路径中,中间件按注册顺序运行。
func init(){kami.use(“/”,login)kami.use(“/private/”,loginrequired) } //登录返回一个具有适当用户对象的新上下文insidefunc login(ctx context.context,w http.responsewriter,r *http.request)context.context {if u,erry err:= user:= user.getBytoken(ctx,r。 formValue(“ auth_token”)); err == nil {ctx = user.newcontext(ctx,u) } return ctx} // loginrequired如果我们没有user objectfunc loginrequired(ctx context.context,w http.responsewriter,r *http.request)context.context.context {如果(CTX); !ok { }返回CTX}
现在支持中间件中指定的参数和通配符。在所有分层中间软件之后,在通配符的路径下注册的中间件将运行。
kami.use(“/user/:id/edit”,checkadminpermissions)//唯一匹配/use/:id/editkami.use(“/user/:id/eedit/*,checkadminpermissions)// ,行为与非参数的路径一样
卡米(Kami)也可以使用香草http中间件。 kami.Use
接受功能以func(next http.Handler) http.Handler
。请注意,Kami将按顺序运行此类中间件,而不是在链条中运行。这意味着标准的伐木者和恐慌处理程序将无法正常工作。您应该使用kami.LogHandler
和kami.PanicHandler
。
以下示例使用goji/httpauth将HTTP基本身份验证添加到/secret/
。
import(“ github.com/goji/httpa“"github.com/guregu/kami") func main(){kami.use(“/secret/”,httpauth.simplebasicauth(“ 。 }
类型Afterware Func(context.Context,mutil.WriterProxy, *http.request)context.context
func init(){kami.after(“/”,清理) }
在请求处理程序之后运行,AfterWare可用于清理。 AfterWare就像中间件的镜像。 AfterWare也可以层次运行,但中间件的相反顺序。在层次毕业之前对通配符进行评估。
例如, /hello/greg
的请求将在以下路径下注册后注册后的软件:
/hello/greg
/hello/
/
这使得在特定路径下的壁warde软件能够使用 /可能通过/
关闭的资源。
与中间件不同,AfterWare返回零不会阻止其余的售后Ware进行评估。
kami.After("/path", afterware)
支持许多不同类型的功能,请参见kami.AfterwareType
的文档,以获取更多详细信息。
*kami.Mux
独立堆栈Kami最初被设计为复杂的Web应用程序中多个软件包之间的“胶水”。全局函数和kami.Context
是您的软件包一起工作的简便方法。但是,如果您想将Kami用作另一个应用程序中的嵌入式服务器,请在不同端口上使用两个单独的KAMI堆栈,或者其他希望拥有Kami的非全球版本, kami.New()
可能会派上用场。
称为kami.New()
返回一个完全独立的kami堆栈的新鲜*kami.Mux
。更改kami.Context
,在kami.Get()
等人注册的路径和在kami.Use()
上注册的全局中间件不会影响*kami.Mux
。
相反,使用mux := kami.New()
您可以更改mux.Context
,call mux.Use()
, mux.Get()
, mux.NotFound()
,等等。
*kami.Mux
实现了http.Handler
,因此您可以使用它!
//软件包管理员是管理面板服务器插件pluginpackage adminimport(“ net/http”“ github.com/guregugu/kami”)//自动安装我们的秘密admin admin suffictfunc init(){mux:= kami.new()mux。 context = admincontextmux.use(“/”,授权)mux.get(“/admin/memstats”,memoryStats) mux.post(“/admin/die”,关闭)// ... http.handle(“/admin/”,mux) }
麻省理工学院
httptreemux:路由器
Goji:优雅,Writerproxy