Quickstart

PynamoDB is a Pythonic interface to AWS DynamoDB. Flask-PynamoDB provides integration with PynamoDB to support this Pythonic interface inside Flask.

Installation

You can easily install Flask-PynamoDB with pip:

pip install Flask-PynamoDB

or:

python -m pip install Flask-PynamoDB

Don’t have pip? Follow these instructions for installing pip.

A Basic Application

To connect your Flask application with DynamoDB, all you have to do is add a configuration to your application, and create the PynamoDB object.

from flask import Flask
from flask_pynamodb import PynamoDB

class Config:
    DYNAMODB_HOST = "http://localhost:8000"
    DYNAMODB_AWS_ACCESS_KEY_ID = "test"
    DYNAMODB_AWS_SECRET_ACCESS_KEY = "test"
    DYNAMODB_READ_CAPACITY_UNITS = 1
    DYNAMODB_WRITE_CAPACITY_UNITS = 1

app = Flask(__name__)
app.config.from_object(Config)
db = PynamoDB(app)

Declaring models is the same as in PynamoDB, but the base model class is flask_pynamo.PynamoDB.Model. Notice that you should import the attributes from pynamodb.

from pynamodb.attributes import UnicodeAttribute, BooleanAttribute

class Todo(db.Model):
    class Meta:
        table_name = "todo"

    id = UnicodeAttribute(hash_key=True)
    name = UnicodeAttribute()
    description = UnicodeAttribute()
    done = BooleanAttribute(default=False)

Now, we can use the regular functions from PynamoDB, such as get, scan, save, etc. However, we can use the new helper functions for Flask:

  • get_or_404: Tries to get a record from the table. If not found, the function raises a 404 error.

  • first_or_404: Tries to get the first record from the table. If the table is empty, the function raises a 404 error.

from typing import List

@app.route("/todo")
def list_todos() -> List[str]:
    return [t.name for t in Todo.scan()]

@app.route("/todo/<todo_id>")
def get_todo(todo_id: str) -> Todo:
    return Todo.get_or_404(todo_id)