Skip to main content

membrane.py 🦠

A Flask arg-parser & splitter to ensure wanted data gets through, unwanted data stays out, and required data shows up.

Compatible with Flask-RESTful. 👍

Basic Usage 🐍

from flask import Flask
app = Flask(__name__)


@app.route('/')
def route_handler():
    return "No args~!"

Above we see a basic Flask application with a root API handler. No query options are yet passed to our root.

Let's say we wanted to handle the query parameter ?limit=0 in the request handler. We can use membrane to do this.

from flask import Flask, jsonify
from membrane import membrane
app = Flask(__name__)


@app.route('/')
@membrane({'limit': int})
def route_handler(microbe):
	'''Here microbe should be either an empty dict: {} or dict: {"limit": ?}'''

    return jsonify(microbe)

Defining Membranes 🔬

The membrane, a wrapper function, can take multiple layers of type dict which will act as a filter for the: 1) query parameters; 2) body; and 3) headers passed to the request handler. The route_handler will take these filtered dicts as *args.

The basic structure is as follows:

simple_membrane = {"limit": int}
complex_membrane = {
	"other_parameter": {
		"type": lambda x: int(x),
		"options": (1, 2, 3,),
		"default": 1,
		"required": False,
		"location": "params"
	}
}

In the simple_membrane, we want to take limit from either the params, body, or headers and convert it to an int (or verify that it is of type int). We're also allowed to use custom functions to handle conversions here.

The complex_membrane is different in that it's a dict with additional options.

  • type: any callable function or class.
  • options: a tuple of accepted values.
  • default: if not provided, use this as a default. If you need this value to be generated at the time of parsing, provide a callable function that returns the proper value.
  • required: should the server throw an error if this value is not provided?
  • location: where in the request should we search for this value: ("params", "body", "headers", "files").

To use multiple layers for a route handler, simply list them out.

@app.route('/')
@membrane(simple_membrane, complex_membrane)
def route_handler(simple_microbe, complex_microbe):
    return jsonify([simple_microbe, complex_microbe])

Error Handling ⚠️

Exported from membrane are exceptions: RequiredFieldError, NotAnOptionError, TypeConversionError.

You can handle these errors yourself or use our default error handler.

from membrane import error_handler

app = Flask(__name__)
error_handler(app)

Otherwise you can handle these errors however you like.

Release files for membrane 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 membrane 0.0.4
File Size Uploaded
membrane-0.0.4.tar.gz 3.9 kB Details

Built distribution (wheel)

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

Total release size: 9.2 kB

Release files / membrane-0.0.4.tar.gz

Download URL membrane-0.0.4.tar.gz
Size 3.9 kB
Tags Source
SHA-256 checksum
How to use checksums
00a19ec79f012edc5cd0dee496a8ad6f09c06ad58de749199aaa7e5de10fb1b4
BLAKE2b-256 checksum
How to use checksums
716c9dcb579fa60a23551a56f065a4ecfc058a9ad50e3caef08fab202c010e92
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.13.0 pkginfo/1.4.2 requests/2.21.0 setuptools/41.1.0 requests-toolbelt/0.8.0 tqdm/4.30.0 CPython/3.7.5rc1

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

Download URL membrane-0.0.4-py3-none-any.whl
Size 5.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3b99db52232c1daf57f84bec7fbfbe92d91568857f503448dd5d57a3593a9d1b
BLAKE2b-256 checksum
How to use checksums
33fe19857336f39d3a9ee738934cdbf5908d441cc3146d85f3254361089a6ed1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.13.0 pkginfo/1.4.2 requests/2.21.0 setuptools/41.1.0 requests-toolbelt/0.8.0 tqdm/4.30.0 CPython/3.7.5rc1

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