Martini: Classy web development in Go
martini.codegangsta.io
martini.codegangsta.io
I particularly like the service injection concept. Django forces every view function to take a request object and return a response object. Flask makes these optional, but then requires you to use global variables to access more information from the request. Martini attempts to resolve any arguments it sees by looking up their static type against a service directory. I think that's really clever.
The way it allows you to stack up Handlers is neat too. Django does this with either globally applied middleware or per-view-function decorators, but there's something really neat about just taking a list of functions for things like authentication and "stacking" them on top of each other - or having that same function applied as middleware to every request using m.Use(func...). Using Context.Next() to allow that middleware to "wrap" a request (the equivalent of Django's process_request and process_response pair) is clever as well.
Colour me impressed!
Ditto. I especially like that it's fully compatible with the existing http.HandlerFunc interface, which is a big deal. This means you can just write "regular" handlers as middleware (or bring them over from existing code) without having to reinvent the wheel.
I also very much like the way it leaves sessions up to you. A few other Go frameworks leverage http.Cookie, instead of letting you use something like gorilla/sessions. I'm a big proponent of server-side sessions (wherever possible) given how simple gorilla/sessions + Redis can be to set up.
I'm a little tempted to use this myself (I've been going mostly naked so far) for my weekend (read: also weeknight) project, given that all the "real" logic (middleware, DB queries, etc.) can be dropped in alongside it.
https://github.com/codegangsta/martini Last commit: 2 hours HN discussion: https://news.ycombinator.com/item?id=6731022
https://github.com/astaxie/beego Last commit: 1 day ago
https://github.com/robfig/revel Last commit: 4 days ago https://news.ycombinator.com/item?id=5996712
https://github.com/aaronlifton/Gooo Last commit: 1 month ago https://news.ycombinator.com/item?id=5057108
https://github.com/hoisie/web Last commit: 5 months ago https://news.ycombinator.com/item?id=6715547
https://github.com/paulbellamy/mango Last commit: 9 months ago
Martini is meant to be non-intrusive and braindead simple to use. Hope you guys like it!
By a happy coincidence, I was just going to start building an API backend in Go today or tomorrow for a side project, and was thinking about doing it with vanilla Go but now I'll probably give Martini a shot (!).
Im hooked, likely to start learning go soon. P.s. Big respect for being able to make the video below 3 min.
[1] http://www.reddit.com/r/golang/comments/1qlfvp/martini_class...
[2] http://www.reddit.com/r/golang/comments/1qlfvp/martini_class...
Are you looking to make this more full featured with an ORM/persistence layer (i.e Rails) or keep it small and similar to Sinatra?
Thanks for the feedback!
There's one use of reflection[1], and it's to ensure that the argument is a function.
Reflection isn't inherently bad; using it at the drop of a hat is.
[1]: https://github.com/codegangsta/martini/blob/master/martini.g...
[edit]: Looks like I missed the `inject` import (thanks breakpete)
See e.g
https://github.com/codegangsta/martini/blob/master/martini.g...
https://github.com/codegangsta/martini/blob/master/martini.g...
Still, the end result is a nice API.
Great-looking website by the way. The first impression is a good impression, it's very polished.
I've done a small project in both Revel and with Gorilla components and found that I actually enjoyed implementing things using Gorilla packages more, giving a great deal of flexibility and not hiding too much in the framework like Revel does.
m := martini.Classic()
// ...
http.Handle("/", m)I threw together an example app with templating and database access as services, I'm impressed by how concise it is.
In fact, having now read the rest of the code, they're pretty much comprehensive.