Light-weight Python framework for building REST APIs
- WSGI
- minimalistic
- easy to use
- advanced variables processing
- automatic html documentation generation
is done by decorating your handling function with one of these decorators:
- @GET
- @POST
only one argument is required (url to handle) ie:
@GET("/my/awesome/url")
def my_function():
...
optionally you can specify successful http result status (default is HTTP_OK) ie:
@GET("/my/awesome/url", status=HTTP_CREATED)
def my_function():
...
list of status tuples:
- HTTP_OK
- HTTP_CREATED
- GET variables from query string
- POST variables can be send as:
- application/x-www-form-urlencoded
- multipart/form-data
- application/json
url path variables (identifier inside curly brackets) ie:
@GET("/my/awesome/url/{variable}") def my_function(variable): ...
per parameter parsing function assigned as default value ie:
@GET("/my/awesome/url")
def my_function(myid=int):
...
optional parameter:
@GET("/my/awesome/url")
def my_function(myid=(int, 0)):
...
reduction multiple into one:
@GET("/my/awesome/url")
def my_function(user_id=lambda user, password: login):
...
build-in support:
| Class | Content-type |
|---|---|
| str | text/plain |
| dict | application/json |
| minidom | application/xml |
| etree | application/xml |
you can also register any custom data-type or override table above with:
register_content_type(type_, content_type, handler)
to return a http error raise one of these exceptions:
- HttpBadRequest
- HttpNotFound
- HttpUnsupportedMediaType
- HttpNotImplemented
ie:
@GET("/my/awesome/url")
def my_function(myid=int):
if myid == -1:
raise HttpNotFound()
...
when is url opened by web-browser html documentation is shown instead of actual function call.
- "application/xhtml+xml" in accept http header
- similar tags to sphinx/docutils
- extra example tags: ":example:" and for response ":rexample":
ie:
@GET("/my/api")
def my_function(a, b=int):
"""
Describe your function here.
:param str a: Describe a here.
:param int b: Describe b here.
:return: W/E you function returns.
:example::
GET /my/api?a=someting&b=42
:rexample::
{
"something": "something"
...
}
"""
...
"real app" example:
GET Hello world:
from wsgiref.simple_server import make_server
from clearest import application, GET
@GET("/")
def hello():
return "hello world!"
httpd = make_server("", 8000, application)
httpd.serve_forever()
Output:
curl localhost:8000
hello world!
POST var:
from wsgiref.simple_server import make_server
from clearest import application, POST
@POST("/")
def hello(what):
return "hello {what}!".format(what=what)
httpd = make_server("", 8000, application)
httpd.serve_forever()
Output:
curl --data "what=world" localhost:8000
hello world!
