import "github.com/guregu/kami"
import "gopkg.in/guregu/kami.v2"
Kami (神 神)는 요청 컨텍스트와 라우팅을위한 httptreemux에 대한 컨텍스트를 사용하는 작은 웹 프레임 워크입니다. 로그 및 공황 후크 외에 요청 전후에 계층 적 미들웨어를 실행하기위한 간단한 시스템이 포함되어 있습니다. Einhorn을 통한 우아한 재시작도 지원됩니다.
Kami는 귀하의 경로, 미들웨어 및 "God Object"의 중심 등록 지점으로 사용되도록 설계되었습니다. 글로벌 기능을 사용하는 것이 좋습니다. 그러나 Kami는 kami.New()
사용하여 여러 Muxes를 지원합니다.
원하는 곳에서 kami.Handler()
자유롭게 마운트 할 수 있지만 유용한 kami.Serve()
기능이 제공됩니다.
다음은 Kami의 탄생에 관한 프레젠테이션이 있으며 디자인 선택 중 일부를 설명합니다.
context
와 x/net/context
모두 지원됩니다.
카미와 컨텍스트를 사용하여 인사를 현지화하는 컨텍스트를 사용하는 예제.
건너 뛰기 ⏩
// WebServerPackage Mainimport ( "FMT" "Net/HTTP" "Context" "github.com/guregu/kami" "github.com/my-github/greeting"// 아래 패키지 인사말 참조) func greet (CTX Context. 컨텍스트, w http.responsewriter, r *http.request) {hello : = greeting.fromContext (CTX) 이름 : = kami.param (ctx, "name") fmt.fprintf (w, " %s, %s!", hello, name) } func main () {ctx : = context.background () ctx = greeting.withContext (ctx, "hello") // 기본 greetingkami.context = ctx // 모든 requestskami에 대한 기본 컨텍스트를 설정합니다. .use ( "/hello/", greeting.guess) //이 미들웨어를 사용하여 경로에 사용하십시오 /hello/kami.get("/hello/:name ", greet) // urlkami.serve ()에 매개 변수가있는 get handler를 추가하십시오.
// 컨텍스트의 인사말 설정 .Package greetingimport ( "net/http" "context" "golang.org/x/text/language") // 컨텍스트에 대한 자세한 내용과이 작업을 수행하는 이유, // https://blog.golang.org/contexttype ctxkey intvar key ctxkey = 0var greetings = 참조하십시오. map [language.tag] string {language.americanEnglish : "yo", language.japanese : "こんにちは", } // 추측은 허용 언어를 검사하고 가능한 경우 더 나은 인사말로 인사하는 Kami Middleware입니다. , _, err : = language.parseacceptlanguage (r.header.get ( "accept-language")); err == nil {for _, t : = 범위 태그 {if g, ok : = 인사 [t]; ok {ctx = withcontext (ctx, g) CTX를 반환합니다 } } } return ctx} // withContext with conteting.func withcontext (ctx context.context, greeting string) context.context {return context.withValue (ctx, key, greeting)로 새로운 컨텍스트를 반환합니다. } // fromContext이 컨텍스트에서 인사말을 검색하거나 누락 된 경우 빈 문자열을 반환합니다.
kami.Get("/path", handler)
, kami.Post(...)
등 /files/*path
사용하여 경로를 설정하십시오 /hello/:name/edit
Kami가 제공하는 컨텍스트를 사용하여 액세스하십시오 : kami.Param(ctx, "name")
. 라우팅 규칙 및 라우팅 우선 순위를 참조하십시오. 다음 종류의 핸들러가 허용됩니다.
kami.ContextHandler
를 구현하는 유형
func(context.Context, http.ResponseWriter, *http.Request)
http.Handler
를 구현하는 유형
func(http.ResponseWriter, *http.Request)
Kami가 사용하는 모든 컨텍스트는 kami.Context
의 후손입니다. 이것은 "신의 대상"이며이 프로젝트의 이름입니다. 기본적으로 이것은 context.Background()
이지만 응용 프로그램에 적합한 사전 시작 컨텍스트로 자유롭게 바꾸십시오.
Google App Engine 타겟팅 빌드는 App Engine의 요청 당 컨텍스트로 "God Object"컨텍스트를 자동으로 래핑합니다.
kami.Use("/path", kami.Middleware)
사용하여 미들웨어를 추가하십시오. 미들웨어는 요청하기 전에 실행되며 일찍 중지 할 수 있습니다. 아래의 미들웨어에 대한 자세한 내용.
kami.After("/path", kami.Afterware)
사용하여 후웨어를 추가하십시오. 후에는 요청 후 실행됩니다.
요청이 완료된 후 모든 요청의 컨텍스트를 자동으로 취소하려면 kami.Cancel
true
로 설정하십시오. 표준 라이브러리와 달리 Kami는 기본적으로 컨텍스트를 취소하지 않습니다.
kami.PanicHandler
설정하여 공황 처리기를 제공 할 수 있습니다. 공황 처리기가 호출되면 kami.Exception(ctx)
으로 공황 오류에 액세스 할 수 있습니다.
모든 요청을 감싸는 kami.LogHandler
를 제공 할 수도 있습니다. kami.LogHandler
다른 기능 서명을 가지고 있으며 응답 상태 코드에 액세스 할 수있는 WriterProxy를 사용합니다.
kami.Serve()
사용하여 응용 프로그램을 우아하게 제공하거나 kami.Handler()
편리하게 마운트하십시오.
미들웨어 func (context.context, http.responsewriter, *http.request) context.context를 입력하십시오
미들웨어는 새로운 컨텍스트를 반환한다는 점에서 핸들러 타입과 다릅니다. 이를 활용하여 소제 경로에 미들웨어를 등록하여 컨텍스트를 구축 할 수 있습니다. 특별한 경우, 당신은 미들웨어 체인의 실행을 중단하기 위해 NIL을 반환 할 수 있습니다.
미들웨어는 계층 적입니다. 예를 들어, /hello/greg
에 대한 요청은 다음 경로에서 등록 된 미들웨어를 실행합니다.
/
/hello/
/hello/greg
경로 내에서 미들웨어는 등록 순서대로 실행됩니다.
func init () {kami.use ( "/", login) kami.use ( "/private/", loginRequired) } // 로그인은 Appropiate 사용자 객체 내면에서 새 컨텍스트를 반환합니다 (CTX Context.Context, w http.responsewriter, r *http.request) context.context {if u, err : = user.getByToken (ctx, r. formvalue ( "auth_token")); err == nil {ctx = user.newContext (ctx, u) } return ctx} // loginRequired 사용자 ObjectFunc LoginRequired (ctx context.context, w http.responsewriter, r *http.request) context.context {if _, ok : = user.fromcontext (CTX); ! OK {W.WriteHeader (http.statusforbidden) // ... 렌더링 503 Forbidden Pagereturn nil } 반환 ctx}
미들웨어의 이름이 지정된 매개 변수와 와일드 카드가 현재 지원됩니다. 와일드 카드가있는 경로 아래에 등록 된 미들웨어는 모든 계층 적 미들웨어 이후에 실행됩니다.
kami.use ( "/user/: id/edit", checkadminpermissions) // 만 일치하는 /user/:id/editkami.use("/user/:id/edit/* ", CheckadminPermissions) // 모든 상속 경로와 일치합니다. , 비모수 경로처럼 동작합니다
Kami는 바닐라 HTTP 미들웨어도 사용할 수 있습니다. kami.Use
func(next http.Handler) http.Handler
형태로 함수를 수락합니다. Kami는 체인이 아닌 순서대로 그러한 미들웨어를 실행할 것입니다. 이것은 표준 로거 및 공황 처리기가 예상대로 작동하지 않음을 의미합니다. 대신 kami.LogHandler
및 kami.PanicHandler
사용해야합니다.
다음 예제는 Goji/httpauth를 사용하여 /secret/
의 경로에 HTTP 기본 인증을 추가합니다.
import ( "github.com/goji/httpauth""github.com/guregu/kami")func main () {kami.use ("/secret/", httpauth.simplebasicauth ("username ","password ")) kami .get ( "/Secret/Message", SecretMessageHandler) kami.serve () }
afterware funcc (context.context, mutil.writerproxy, *http.request) context.context를 입력합니다
funcc init () {kami.after ( "/", 정리) }
요청 핸들러 후 실행하면웨어웨어 후에는 정리에 유용합니다. 애프터웨어는 미들웨어의 미러 이미지와 같습니다. 후에는 또한 계층 적으로 실행되지만 미들웨어의 역 순서도 실행됩니다. 와일드 카드는 계층 적 후에 계층 이전에 평가됩니다.
예를 들어, /hello/greg
에 대한 요청은 다음 경로에서 등록 된 후 실행됩니다.
/hello/greg
/hello/
/
이는 특정 경로에서 후에웨어를 제공합니다 /
Middleware와 달리 NIL을 반환 한 후 NIL은 나머지 후에 나머지가 평가되는 것을 막지 않습니다.
kami.After("/path", afterware)
다양한 유형의 기능을 지원합니다. 자세한 내용은 kami.AfterwareType
의 문서를 참조하십시오.
*kami.Mux
가진 독립적 인 스택 Kami는 원래 복잡한 웹 응용 프로그램의 여러 패키지 사이의 "접착제"로 설계되었습니다. 글로벌 기능과 kami.Context
는 패키지가 함께 작동하기 쉬운 방법입니다. 그러나 Kami를 다른 앱 내에서 임베디드 서버로 사용하려면 다른 포트에 두 개의 별도의 Kami 스택을 제공하거나, 그렇지 않으면 kami.New()
가 아닌 Kami 버전을 갖고 싶을 수도 있습니다.
kami.New()
에게 전화하면 완전히 독립적 인 Kami 스택 인 Fresh *kami.Mux
반환합니다. kami.Context
, kami.Get()
et al에 등록 된 경로 및 kami.Use()
에 등록 된 글로벌 미들웨어는 a *kami.Mux
영향을 미치지 않습니다.
대신, mux := kami.New()
사용하면 mux.Context
변경할 수 있습니다. mux.Use()
, mux.Get()
, mux.NotFound()
등으로 전화 할 수 있습니다.
*kami.Mux
http.Handler
구현하므로 원하는대로 사용할 수 있습니다!
// 패키지 관리자는 관리자 패널 웹 서버 플러그인 패키지 adminimport입니다 ( "net/http" "github.com/guregu/kami") // 자동으로 비밀 관리자 stufffunc init () {mux : = kami.new () mux. Context = AdminContextMux.use ( "/", Authorize) mux.get ( "/admin/memstats", memorystats) mux.post ( "/admin/die", shutdown) // ... http.handle ( "/admin/", mux) }
MIT
httptreemux : 라우터
GOJI : 우아하고, 작가 프록시