Skip to main content

Cutshort

Yet another, experimental nano framework to write WSGI REST API apps using python functions, mostly.

How to Install

pip install cutshort

A Pic Generated by Dall-E

I was looking for a dark, pale yet dope background image for cutshort. So, Dall-E game me this. Prompt was,

night sky with a terror looking blackhole, digital art, high resolution

background

The Very First Hello World

Cutshort is developed keeping in mind that you write a python function, and you would directly publish it to let it be consumed. First import API and simple_server from cutshort

from cutshort import API, simple_server

Instantiate the API object and follow on.

api = API()

By default, it is going to console print some logs. ( will remove it pretty soon, promise). To avoid logging,

api = API(debug= False)

Define any python function,

def get_summation(a: int, b: int):
    return a + b

Register this function to API object.

api.add_func(get_summation, path='/', http_method='GET')

add_func receives a handler_function, a path variable and http_method.

Automatic method registering with routing path

cutshort can check the handler_func name and can assign both routing_path and http_method.

Function name should start with a action name like create,update, get, fetch etc followed by a _ underscore and a resource name with some extension. example

user_db = [
    {'ID': 1, 'name': 'John Doe', 'age': 21},
    {'ID': 2, 'name': 'Jane Doe', 'age': 23}]

def get_users():
    resp = {
        'users': user_db
    }
    return resp

api.add_func(get_users)

So, api.add_func(get_users) would set the routing path to get_users and http_method to 'GET'

Handling Function Parameters

cutshort currenly only supports inputs from Request-Body and JSON-ENCODED. Internally, when a handler is set against a particular routing path, request processor first looks for the params in the request-body in JSON, and then delivers it to the function. After the processing, it collects the response and sends the response after json encoding. Example:

def get_user_by_id(user_id: int):
    for user in user_db:
        if user.get('ID') == user_id:
            resp = {
                'user': user
            }
            return resp
    return None

Here, the request body should be,

{
	"user_id": 1
}

while sending request from Insomnia or POSTMAN HTTP Clients.

Running the Application

As API is a WSGI callable so it can easily be run with Gunicorn, Waitress or any similar WSGIServer. For development purpose, a simple server simple_server is provided with cutshort, which is a very light wrap-around simple_server from werkzeug. So, running is simply,

if __name__ == '__main__':
    simple_server(host='localhost', port=8456, application=api)

Complete Example [Almost]

from cutshort import API, simple_server

api = API()

user_db = [
    {'ID': 1, 'name': 'John Doe', 'age': 21},
    {'ID': 2, 'name': 'Jane Doe', 'age': 23}]


def get_summation(a: int, b: int):
    return a + b


def get_users():
    resp = {
        'users': user_db
    }
    return resp


def get_user_by_id(user_id: int):
    for user in user_db:
        if user.get('ID') == user_id:
            resp = {
                'user': user
            }
            return resp
    return None


def create_user(id: int, name: str, age: int):
    user = {
        'ID': id,
        'name': name,
        'age': age
    }
    user_db.append(user)
    return user_db


def delete_user(id: int):
    for index, user in enumerate(user_db):
        if user.get('ID') == id:
            user_db.remove(user)
            return user_db
    return None


def update_user(id: int, name: str):
    for user in user_db:
        if user.get('ID') == id:
            user['name'] = name
            return user
    return None


def send_message(message: str):
    return 'Your Message is + {}'.format(message)


api.add_func(get_summation, path='/', http_method='GET')
api.add_func(send_message,http_method='POST')
api.add_func(get_users)
api.add_func(get_user_by_id)
api.add_func(create_user)
api.add_func(delete_user)
api.add_func(update_user)

if __name__ == '__main__':
    simple_server(host='localhost', port=8456, application=api)

Future Planning

  1. Adding Middleware support for interacting with Request and Response objects.
  2. Reading function params from url-params.
  3. Adding proper logging and debugging messages.

Inspirations

This is a pet project and it should not be considered to be using in a critical production environment. This project heavily relies on python packages like parse, WebOb and Werkzeug.

Also, cutshort is inspired by Lumi

Release files for cutshort 0.0.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for cutshort 0.0.4
File Size Uploaded
cutshort-0.0.4.tar.gz 5.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for cutshort 0.0.4
File Interpreter ABI Platform
cutshort-0.0.4-py3-none-any.whl Python 3 none any Details

Total release size: 11.0 kB

Release files / cutshort-0.0.4.tar.gz

Download URL cutshort-0.0.4.tar.gz
Size 5.3 kB
Tags Source
SHA-256 checksum
How to use checksums
10fc7ef7035ad0583ce0464e8b10db6c784641e8bb09c630522dfd8b306962d3
BLAKE2b-256 checksum
How to use checksums
afce8c6053c38bda49ee0efbc97b7446f580b2e98d747d8eb2958b80bb5ff0a4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.8.10

Release files / cutshort-0.0.4-py3-none-any.whl

Download URL cutshort-0.0.4-py3-none-any.whl
Size 5.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bdff27eb8948a5b499366f0f332a64415fcf284329f7ece78fe78c7e20054746
BLAKE2b-256 checksum
How to use checksums
940f4a84b47ae34616119e8f8d2ebfc60bdeda17392e559a520c96b3618d1f84
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.8.10

Release history Release notifications | RSS feed

This release

0.0.4 This release

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page