import "github.com/guregu/kami" или import "gopkg.in/guregu/kami.v2"
Kami (神) - это крошечная веб -структура, использующая контекст для контекста запроса и httptreemux для маршрутизации. Он включает в себя простую систему для запуска иерархического промежуточного программного обеспечения до и после запросов, в дополнение к журналам и паническим крючкам. Изящный перезапуск через Эйнхорн также поддерживается.
Ками предназначен для использования в качестве центральной точки регистрации для ваших маршрутов, промежуточного программного обеспечения и контекста «объект Бога». Вам рекомендуется использовать глобальные функции, но Ками поддерживает несколько мукса с kami.New() .
Вы можете свободно выполнять kami.Handler() где бы вы ни хотели, но предоставляется полезная функция kami.Serve() .
Вот презентация о рождении Ками, объясняющая некоторые варианты дизайна.
Поддерживаются и context , и x/net/context .
Приводимый пример, использующий Ками и контекст для локализации приветствий.
Пропустить ⏩
// Наш webserverpackage mainimport ("fmt" "net/http" "контекст" "github.com/guregu/kami" "github.com/my-github/greeting" // См. Приветствие пакета ниже) Func Greet (ctx context. Контекст, w http.responsewriter, r *http.request) {hello: = Приветствие. FromContext (ctx) Имя: = kami.param (ctx, "name") fmt.fprintf (w, " %s, %s!", Привет, имя)
} func main () {ctx: = context.background () ctx = greeting.withcontext (ctx, "hello") // Установить по умолчанию Greetingkami.context = ctx // Установите наш контекст бог », базовый контекст для всех запросов efferskami .Use ("/hello/", Greeting.guess) // Использовать это промежуточное программное обеспечение для путей под /Hhello/kami.get("/hello/:name ", приветствие) // Добавить обработчик Get с параметром в urlkami.serve () // изящно служить с поддержкой Einhorn и Systemd} // Приветствие пакета хранилище настройки приветствия в контексте. См. https://blog.golang.org/contexttype ctxkey intvar key ctxkey = 0var приветствия = map [language.tag] string {ranguage.americanenglish: "yo", ranguage.japanese: "こんにちは",
} // Угадай-это промежуточное программное обеспечение KAMI, которое проверяет аванс-языку и устанавливает // приветствие на лучшее, если возможно. , _, err: = language.parseacceptlanguage (r.header.get ("accept-language")); err == nil {for _, t: = range Tag {if g, ok: = greetings [t]; ok {ctx = withContext (ctx, g) return ctx
}
}
} return ctx} // withContext Возвращает новый контекст с данным Greeting.func withContext (ctx context.context, string string) context.context {return context.withvalue (ctx, ключ, приветствие)
} // fromContext Получает приветствие из этого контекста, // или возвращает пустую строку, если отсутствует .func fromContext (ctx context.context) string {hello, _: = ctx.value (key). (String) return hello} Настройка маршрутов с использованием kami.Get("/path", handler) /files/*path kami.Post(...) и т /hello/:name/edit Д. и получить доступ к ним, используя контекст, который дает вам Ками: 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 автоматически завершат контекст «объекта Бога» в контекст для первой проверки приложений.
Добавьте промежуточное программное обеспечение с помощью kami.Use("/path", kami.Middleware) . Промежуточное программное обеспечение работает перед запросами и может остановить их рано. Подробнее о промежуточном программном обеспечении ниже.
Добавьте после программного обеспечения с kami.After("/path", kami.Afterware) . Попугация запускается после запросов.
Установите kami.Cancel в true , чтобы автоматически отменить все контексты запроса после завершения запроса. В отличие от стандартной библиотеки, Ками не отменяет контексты по умолчанию.
Вы можете предоставить обработчик паники, установив kami.PanicHandler . Когда обработан паническим обработчиком, вы можете получить доступ к ошибке паники с помощью kami.Exception(ctx) .
Вы также можете предоставить kami.LogHandler , который будет завернуть каждый запрос. kami.LogHandler имеет другую подпись функции, принимая писательную пророк, которая имеет доступ к коду состояния ответа и т. Д.
Используйте kami.Serve() , чтобы изящно подавать свое применение, или Mount kami.Handler() где -то удобно.
Type Middleware 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 User -объектом InsideFunc vygin (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 останавливает запрос, если у нас нет пользовательского объекта loginrequired (ctx context.context, w http.responsewriter, r *http.request) context.context {if _, ok: = user.fromContext (CTX); ! OK {W.WriteHeader (http.statusforbidden) // ... рендеринг 503 Forbidden Papagereturn nil
} вернуть CTX}Названные параметры и подстановки в промежуточном программном обеспечении поддерживаются сейчас. Промежуточное программное обеспечение, зарегистрированное под пути с подстановочным знаком, будет работать после всего иерархического промежуточного программного обеспечения.
kami.use ("/user/: id/edit", checkadminpermissions) // совпадает только /сар/:id/editkami.use("/user/:id/edit/* ", чек , ведет себя как непараметрируемые пути Ками также может использовать промежуточное программное обеспечение Vanilla HTTP. kami.Use принимает функции в форме func(next http.Handler) http.Handler . Рекомендуется, чтобы Ками запустит такое промежуточное программное обеспечение в последовательности, а не в цепочке. Это означает, что стандартные лесозаготовители и обработчики паники не будут работать, как вы ожидаете. Вместо этого вы должны использовать kami.LogHandler и kami.PanicHandler .
В следующем примере используется goji/httpauth для добавления базовой аутентификации HTTP к путям под /secret/ .
Импорт ("github.com/goji/httpauth""github.com/guregu/kami")func main () {kami.use ("/secret/", httpauth.simplebasicauth (" имя пользователя "," пароль ")) kami .Get ("/secret/message", secretmessagehandler) kami.serve ()
}Type Afterware Func (context.context, mutil.writerProxy, *http.request) context.context
func init () {kami.after ("/", очистка)
}Заработав после обработчика запроса, вспомогательная программа полезна для очистки. По всему посуду подобно зеркальному изображению промежуточного программного обеспечения. После посуды также работает иерархически, но в обратном порядке промежуточного программного обеспечения. Укрики оцениваются перед иерархическим последующим программным обеспечением.
Например, запрос на /hello/greg будет запускать послеоборудование, зарегистрированное в соответствии с следующими путями:
/hello/greg
/hello/
/
Это дает последующую посуду по конкретным путям возможность использовать ресурсы, которые могут быть закрыты / .
В отличие от промежуточного программного обеспечения, послеоперационное посуду, возвращающее NIL , не остановит оставшуюся послеохранную посуду.
kami.After("/path", afterware) поддерживает множество различных типов функций, см. Документы для kami.AfterwareType для получения более подробной информации.
*kami.Mux Первоначально Ками был разработан, чтобы быть «клей» между несколькими пакетами в сложном веб -приложении. Глобальные функции и kami.Context - это простой способ для ваших пакетов работать вместе. Однако, если вы хотите использовать Kami в качестве встроенного сервера в другом приложении, подайте два отдельных стека Kami в разных портах или иным образом хотели бы иметь неглобальную версию Kami, kami.New() может пригодиться.
Вызов kami.New() возвращает свежий *kami.Mux , полностью независимый стек Ками. Изменения в kami.Context , Paths, зарегистрированные в kami.Get() и др., И глобальное промежуточное программное обеспечение, зарегистрированное в kami.Use() не будут влиять на *kami.Mux .
Вместо этого, с mux := kami.New() вы можете изменить mux.Context , call mux.Use() , mux.Get() , mux.NotFound() и т. Д.
*kami.Mux реализует http.Handler , так что вы можете использовать его так, как хотите!
// Admin Package - это плагин -плагин панели администратора AdminiMport ("net/http" "github.com/guregu/kami") // Автоматическое монтаж нашего секретного администратора inti init () {mux: = kami.new () mux. Context = admincontextmux.use ("/", Authorize) mux.get ("/admin/memstats", Memorystats) mux.post ("/admin/die", shutdown) // ... http.handle ("/admin/", mux)
}Грань
httptreemux: маршрутизатор
Годзи: Гарсивное, писательница