import "github.com/guregu/kami"
أو import "gopkg.in/guregu/kami.v2"
Kami (神) هو إطار عمل ويب صغير يستخدم سياق سياق الطلب و httptreemux للتوجيه. ويتضمن نظامًا بسيطًا لتشغيل الوسيطة الهرمية قبل وبعد الطلبات ، بالإضافة إلى خطافات السجل والذعر. إعادة تشغيل رشيقة عبر einhorn مدعوم أيضًا.
تم تصميم Kami لاستخدامه كنقطة تسجيل مركزية لطرقك ، والبرامج الوسيطة ، والسياق "God Object". يتم تشجيعك على استخدام الوظائف العالمية ، لكن Kami يدعم العديد من muxes مع kami.New()
.
أنت حر في Mount kami.Handler()
أينما كنت ، ولكن يتم توفير وظيفة kami.Serve()
مفيدة.
فيما يلي عرض تقديمي حول ولادة كامي ، موضحًا بعض خيارات التصميم.
يتم دعم كل من context
و x/net/context
.
مثال مفتعل باستخدام كامي والسياق لتوطين التحيات.
تخطي ⏩
. السياق ، W http.responseWriter ، r *http.request) {hello: = = MEREANG.FromContext (CTX) الاسم: = kami.param (ctx ، "name") fmt.fprintf (w ، "٪ s ، ٪ s!" ، مرحبًا ، الاسم) } func main () {ctx: = context.background () ctx = meturing.withContext (ctx ، "hello") . /hello/kami.get("/hello/:name "، تحية) // إضافة معالج الحصول على معلمة في urlkami.serve ()
// حزمة متاجر المعايير تخزين الإعدادات في السياق. انظر https://blog.golang.org/contexttype ctxkey intvar key ctxkey = 0var greetings = MAP [language.tag] String {language.americanenglish: "yo" ، language.japanese: "こんにちは" ، }. ، _ ، err: = language.parseacceptLanguage (r.header.get ("قبول اللغة")) ؛ err == nil {for _ ، t: = range tag {if g ، ok: = تحية [t] ؛ موافق {ctx = withContext (ctx ، g) إرجاع ctx } } } إرجاع CTX} // مع إرجاع سياق جديد مع GRAETING. } // fromContext يسترجع التحية من هذا السياق ، // أو إرجاع سلسلة فارغة إذا فقدت.
قم بإعداد الطرق باستخدام kami.Get("/path", handler)
/files/*path
kami.Post(...)
/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 تلقائيًا سياق "God Object" مع سياق محرك App Per-request.
أضف الوسيطة مع kami.Use("/path", kami.Middleware)
. يعمل الوسيطة قبل الطلبات ويمكن أن يمنعها مبكرًا. المزيد على الوسيطة أدناه.
إضافة البرامج مع kami.After("/path", kami.Afterware)
. يتم تشغيل البرامج بعد الطلبات.
قم بتعيين kami.Cancel
على true
لإلغاء جميع سياقات جميع الطلبات بعد الانتهاء من الطلب. على عكس المكتبة القياسية ، لا يقوم Kami بإلغاء السياقات بشكل افتراضي.
يمكنك توفير معالج الذعر من خلال تعيين kami.PanicHandler
. عندما يتم استدعاء معالج الذعر ، يمكنك الوصول إلى خطأ الذعر مع kami.Exception(ctx)
.
يمكنك أيضًا توفير kami.LogHandler
الذي سوف يلف كل طلب. لدى kami.LogHandler
توقيع وظيفي مختلف ، حيث يأخذ كاتب Proxy يمكنه الوصول إلى رمز حالة الاستجابة ، إلخ.
استخدم kami.Serve()
لخدمة تطبيقك بأمان ، أو Mount 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) }. 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.fromcontxt (CTX) ؛ ! OK {W.WriteHeader (http.statusforbidden) // ... عرض 503 PageReturn nil } إرجاع CTX}
يتم دعم المعلمات المسماة والبطاقات البرية في الوسيطة الآن. سيتم تشغيل البرامج الوسيطة المسجلة تحت مسار مع بطاقة Wildcard بعد جميع البرامج الوسيطة الهرمية.
kami.use ("/user/: id/edit" ، checkadminpermissions) // مطابقة فقط /user/: يتصرف مثل المسارات غير المعلمة
يمكن لـ Kami استخدام برامج Vanilla HTTP أيضًا. kami.Use
يقبل الوظائف في شكل func(next http.Handler) http.Handler
. ننصح بأن Kami سيقوم بتشغيل هذه البرامج الوسيطة بالتسلسل ، وليس في سلسلة. هذا يعني أن عمليات تسجيل الدخول القياسية ومعالجات الذعر لن تعمل كما تتوقع. يجب عليك استخدام kami.LogHandler
و kami.PanicHandler
بدلاً من ذلك.
يستخدم المثال التالي goji/httpauth لإضافة مصادقة HTTP الأساسية إلى المسارات تحت /secret/
.
استيراد ("github.com/goji/httpauth""github.com/guregu/kami")func main () {kami.use ("/secret/"، httpauth.simplebasicauth (" username "،" password ")) kami .get ("/secret/message" ، secretmessageHandler) kami.serve () }
اكتب func func (context.context ، mutil.writerproxy ، *http.request) context.context
func init () {kami.after ("/" ، cleanup) }
تشغيل بعد معالج الطلب ، فإن البرامج اللاحقة مفيدة للتنظيف. البرامج الشهرية تشبه صورة المرآة للويديات الوسيطة. تعمل البرامج اللاحقة أيضًا بشكل هرمي ، ولكن بالترتيب العكسي للوسيط. يتم تقييم الأحرف البرية قبل البرامج الهرمية.
على سبيل المثال ، سيتم تشغيل طلب /hello/greg
بعد البرامج المسجلة تحت المسارات التالية:
/hello/greg
/hello/
/
هذا يعطي البرامج تحت مسارات محددة القدرة على استخدام الموارد التي قد يتم إغلاقها بواسطة /
.
على عكس البرامج الوسيطة ، لن يمنع NIL بعد البرامج المتبقية من التقييم.
kami.After("/path", afterware)
يدعم العديد من أنواع الوظائف المختلفة ، راجع مستندات kami.AfterwareType
لمزيد من التفاصيل.
*kami.Mux
تم تصميم Kami في الأصل ليكون "الغراء" بين حزم متعددة في تطبيق ويب معقد. تعد الوظائف العالمية و kami.Context
وسيلة سهلة للعمل معًا. ومع ذلك ، إذا كنت ترغب في استخدام KAMI كخادم مضمن داخل تطبيق آخر ، فخدمة اثنين من مداخن kami منفصلة على منافذ مختلفة ، أو بطريقة أخرى ترغب في الحصول على نسخة غير عاقل من kami ، kami.New()
قد يكون في متناول يدي.
استدعاء kami.New()
يعيد طازجة *kami.Mux
، كومة kami مستقلة تمامًا. لن تؤثر التغييرات على kami.Context
، والمسارات المسجلة لدى kami.Get()
et al ، والبرامج الوسيطة العالمية المسجلة لدى kami.Use()
على *kami.Mux
.
بدلاً من ذلك ، مع mux := kami.New()
يمكنك تغيير mux.Context
، call mux.Use()
، mux.Get()
، mux.NotFound()
، إلخ.
*kami.Mux
ينفذ http.Handler
، لذلك يمكنك استخدامه كما تريد!
// Package Admin عبارة عن مكون إضافي لخادم Web Plank Plank (Net/http "" github.com/guregu/kami ") // تلقائيًا قم بتركيب stufffunc secret earch () {mux: = kami.new () mux. Context = AdmincontextMux.use ("/" ، Ouplize) mux.get ("/admin/memstats" ، MemoryStats) mux.post ("/admin/die" ، stapdown) // ... http.handle ("/admin/" ، mux) }
معهد ماساتشوستس للتكنولوجيا
httptreemux: جهاز التوجيه
غوجي: رشيقة ، الكاتب