Skip to main content

Banjo

Banjo is an abstraction over django which provides a simplified subset of django's functionality, meant for beginners. All the django documentation can be used for reference, and many django patterns are replicated here.

Needs

The purpose of Banjo is to introduce databases as a persistence layer behind an API server, while abstracting away details for which students are not yet ready and creating as few misconceptions as possible. Banjo should be thought of as scaffolding; when they are ready, students should be able to seamlessly transition to django.

Specific concepts which we target for simplification include:

  • Simplify DB schema: A severely-limited subset of field types is provided. Field names correspond to familiar Python types. All fields have default values. Migrations are handled automatically. Within these constraints, django's full ORM is available.
  • Simplify filesystem layout: Only two files are required: models.py and views.py.
  • Simplify management commands: There is a single command, banjo, which effectively runs django's makemigrations, migrate, and runserver in sequence. banjo --shell enters the REPL with all user-defined models loaded.
  • Simplify request/response lifecycle: View functions receive a dict of params and must return a dict. View-URL binding is handled by decorators, as in flask, and all URLs are static (there are no placeholders and no params are passed to the view). Http errors are provided as exceptions, which simplifies control flow. Models have from_dict (class method) and to_dict (instance method) helpers.

Banjo was designed for use by teachers familiar with django; this is intentionally a leaky abstraction which provides a structured introduction into the power and the complexity of the underlying system.

Creating an app

Banjo can be installed with pip install django-banjo.

To write a Banjo app, create a folder called app, define models in models.py and define views in views.py. Here's a simple example.

Models

First, we define our models. Banjo provides five field types:

  • BooleanField (True, False)
  • IntegerField (1, -102)
  • FloatField (0.045, 11.5)
  • StringField ("alligator", "hazelnut")
  • ForeignKey (An instance of another model)

Create a Model for each object your app will interact with.

# app/models.py
from banjo.models import Model, StringField

class Animal(Model):
    name = StringField()
    sound = StringField()

Views

Next we define our views. Each view is a function which receives a dict (called params in the example below) and which must return a dict. Use the banjo.urls.route_get and banjo.urls.route_post decorators to route URLs to your view functions.

# app/views.py
from banjo.urls import route_get, route_post
from app.models import Animal

@route_post('newanimal', args={'name': str, 'sound': str})
def add_animal(params):
    animal = Animal.from_dict(params)
    animal.save()
    return animal.to_dict()

@route_get('listen')
def list_animal_sounds(params):
    sounds = []
    for animal in Animal.objects.all():
        sounds.append('{} says {}'.format(animal.name, animal.sound))     
    return {'sounds': sounds}

Some views, such as "newanimal," require arguments. When a view requires arguments, pass an args dict to the decorator to specify the expected names and types of arguments. Argument types must be str, bool, int, or float.

HTTP errors

If something goes wrong and it's the client's fault, you can raise an error. For example, you might add another view to app/views.py:

from banjo.http import Forbidden

@route_get('secrets')
def do_not_show_the_secrets(params):
    raise Forbidden("Nice try.")

Again, from the command line:

$ http GET localhost:5000/secrets
HTTP/1.1 403 Forbidden

{
    "error": "Nice try."
}

The following errors are available in banjo.http:

  • BadRequest (400)
  • Forbidden (403)
  • NotFound (404)
  • NotAllowed (405)
  • ImATeapot (418)

Running the app

Now you can run banjo from the directory containing the app folder and the server will start. Use the --port command to serve from a custom port; the default is 5000.

Banjo provides a visual API browser at /api.

Screenshot of visual API browser

Here is an example of interacting with this app using the httpie command-line utility:

$ http localhost:5000/newanimal name=elehpant sound=pffffftttttt

{ 
  "id": 1,
  "name": "elephant",
  "sound": "pffffftttttt"
}

$ http localhost:5000/newanimal name=squirrel sound=chcheee

{ 
  "id": 2,
  "name": "squirrel",
  "sound": "chcheee"
}

$ http localhost:5000/listen

{
  "sounds": [
    "elephant says pffffftttttt",
    "squirrel says chcheee"
  ]
}

Shell

You can also interact with your app's models from a Python shell. Just pass the --shell argument to banjo:

$ banjo --shell
> Animal.objects.count()
2

Metadata

Release files for django-banjo 0.9.2

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

Source distribution (sdist)

Source distribution for django-banjo 0.9.2
File Size Uploaded
django_banjo-0.9.2.tar.gz 11.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for django-banjo 0.9.2
File Interpreter ABI Platform
django_banjo-0.9.2-py3-none-any.whl Python 3 none any Details

Total release size: 26.2 kB

Release files / django_banjo-0.9.2.tar.gz

Download URL django_banjo-0.9.2.tar.gz
Size 11.8 kB
Tags Source
SHA-256 checksum
How to use checksums
95352b28beba082134d79452d371f3d999d61293cecdb3bb352ebe33c1c03072
BLAKE2b-256 checksum
How to use checksums
e75d3da8b33b5a403d85f4e750f552e61a7b14abdb4a8f293b24bdf6ce2f655d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.4 {"installer":{"name":"uv","version":"0.11.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / django_banjo-0.9.2-py3-none-any.whl

Download URL django_banjo-0.9.2-py3-none-any.whl
Size 14.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ba76bd401adc444a67d34124cf3ea4c57daa5a9c25cba023167fc7420fd83176
BLAKE2b-256 checksum
How to use checksums
f50d9b26a31df7971389c960357eead20c5e255205f34e4d5c92489e67b3eb0b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.4 {"installer":{"name":"uv","version":"0.11.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

This release

0.9.2 This release

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.3

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.9

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

0.0.15

2 release files

0.0.14

2 release files

0.0.13

2 release files

0.0.12

2 release files

0.0.11

2 release files

0.0.10

2 release files

0.0.9

2 release files

0.0.8

2 release files

0.0.7

2 release files

0.0.6

2 release files

0.0.5

2 release files

0.0.4

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