Project Name | Stars | Downloads | Repos Using This | Packages Using This | Most Recent Commit | Total Releases | Latest Release | Open Issues | License | Language |
---|---|---|---|---|---|---|---|---|---|---|
Django Rest Swagger | 2,516 | 2,031 | 41 | 2 years ago | 50 | April 30, 2018 | 168 | bsd-2-clause | Python | |
Swagger Documentation Generator for Django REST Framework: deprecated | ||||||||||
Djangorestframework Camel Case | 521 | 93 | 16 | a month ago | 16 | December 14, 2021 | 26 | other | Python | |
Camel case JSON support for Django REST framework. | ||||||||||
Django Rest Framework Csv | 286 | 228 | 11 | 2 years ago | 12 | May 16, 2021 | 27 | bsd-2-clause | Python | |
CSV Tools for Django REST Framework | ||||||||||
Drf Ujson Renderer | 118 | 9 | 4 years ago | 2 | April 07, 2015 | 11 | mit | Python | ||
Django Rest Framework renderer using ujson | ||||||||||
Djburger | 77 | 3 years ago | 11 | September 07, 2018 | 3 | lgpl-3.0 | Python | |||
Framework for safe and maintainable web-projects. | ||||||||||
Django Rest Framework Msgpack | 76 | 4 | 4 years ago | 3 | April 22, 2017 | 6 | other | Python | ||
MessagePack support for Django REST framework | ||||||||||
River | 31 | 7 years ago | October 05, 2021 | 4 | apache-2.0 | Go | ||||
River is a simple and lightweight REST server | ||||||||||
Drf_ujson2 | 28 | 4 months ago | 4 | mit | Python | |||||
JSON parser and renderer using ujson for Django Rest Framework | ||||||||||
Django_restframework_apiview | 24 | 2 years ago | 2 | lgpl-3.0 | Python | |||||
Django REST_framework APIView | ||||||||||
Rest Framework Latex | 23 | 3 years ago | 10 | January 23, 2018 | 5 | mit | Python | |||
A LaTeX renderer for Django REST Framework |
River is a simple and lightweight REST server.
rv := river.New()
Use middlewares
rv.Use(river.Logger())
Create endpoints
e := river.NewEndpoint().
Get("/:id", func(c *river.Context){
id := c.Param("id")
... // fetch data with id
c.Render(200, data)
}).
Post("/", func(c *river.Context){
... // process c.Body and store in db
c.Render(201, data)
})
...
e.Use(MyMiddleware) // endpoint specific middleware
Handle endpoints
rv.Handle("/user", e)
Run
rv.Run(":8080")
Check example code for more.
Basic flow
Request -> Middlewares -> Endpoint -> Renderer
Full flow
Request
|
|
Router
/ \
/ \
/ \
Found Not Found / Method Not Allowed
\ /
\ /
\ /
Global Middlewares
/ \
/ \
Endpoint Middlewares Not Found / Method Not Allowed Handler
| |
| |
Endpoint Renderer
|
|
Renderer
Create
e := river.NewEndpoint()
Handle Requests
e.Get("/", handler).Post(...).Put(...) // method chaining
e.Handle(method, ...) // for custom request methods
River supports dependency injection. With that, any function can be an endpoint handler.
func () {...} // valid
func (c *river.Context) {...} // valid
func (c *river.Context, m MyStruct) {...} // valid
func (w http.ResponseWriter, r *http.Request) {...} // valid
func (w http.ResponseWriter, r *http.Request, m MyStruct) {...} // valid
JSON helper
func (c *river.Context){
var users []User
c.DecodeJSONBody(&users)
... // process users
}
Any function that takes in the context can be used as a middleware.
type Middleware func(c *river.Context)
River comes with river.Recovery()
for panic recovery.
rv.Use(Middleware) // global
e.Use(Middleware) // endpoint
Middleware can choose to terminate request flow by not calling c.Next()
. e.g. Authentication middleware.
func (c *river.Context){
... // do something before
c.Next()
... // do something after
}
Any http.Handler
can also be used as a middleware.
rv.UseHandler(handler)
Registering
var m MyStruct
...
rv.Register(m) // global
e.Register(m) // endpoint
This will be passed as parameter to any endpoint handler that has MyStruct
as a function parameter.
func handle(c *river.Context, m MyStruct) { ... }
Middlewares can also register request scoped service.
func AuthMiddleware(c *river.Context) {
var session *Session
... // retrieve session
c.Register(session)
}
Renderer takes in data from endpoints and renders the data as response.
context.Render(...)
renders using the configured Renderer. JSONRenderer
is one of the available renderers.
Example Renderer, transform response to JSend format before sending as JSON.
func MyRenderer (c *river.Context, data interface{}) error {
resp := river.M{"status" : "success", "data" : data}
if _, ok := data.(error); ok {
resp["status"] = "error"
resp["message"] = data
delete(resp, "data")
}
return JSONRenderer(c, resp)
}
Setting a Renderer. When an endpoint Renderer is not set, global Renderer is used.
rv.Renderer(MyRenderer) // global
e.Renderer(MyRenderer) // endpoint
River is an http.Handler
. You can do without Run()
.
http.ListenAndServe(":8080", rv)
River uses httprouter underneath.
Well, yes. You only need to know how to swim or wear a life jacket.
Apache 2