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:= forting.fromcontext(ctx)名稱:= kami.param(ctx,ctx,“ name”) ,你好,名字) } func main(){ctx:= context.background()ctx = engering.withContext(ctx,“ hello”)//設置默認default engingkami.context = ctx //設置我們的“上帝上下文”,所有請求的基本上下文。 。
//包裝招呼商店在上下文中的問候設置。packageetingimport(“ net/http”“ context”“ golang.org/x/text/language”)//有關上下文的更多信息以及我們為什麼這樣做,//請參閱https://blog.golang.org/contexttype ctxkey intvar鍵ctxkey = 0var engretings = map [latchand..tag] string {language.mericanenglish:yo yo“ yo”,Leganch..japanese:“ 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”,shutdown)// ... http.handle( “/admin) /“,Mux) }
麻省理工學院
httptreemux:路由器
Goji:優雅,Writerproxy