The Admin Interface

In addition to a RESTful API service, sandman2 provides a HTML-based admin interface that allows you to view and manipulate the data in your tables. To access the admin interface, simply navigate to /admin once your service is started.

On the left sidebar, you’ll see a list of all the services you specified (i.e. the database tables you chose to include). Clicking one will show the contents of that table, paginated. You can edit a record by clicking on the pencil icon or delete a record using the trashcan icon.

You may notice that foreign keys are displayed with their default Python representation (i.e. <flask_sqlalchemy.Artist object @ 0xdeadbeef>). To show foreign keys in a more useful way, you can define your own extensions to the classes reflected in the database and add a __unicode__ member function.

Imagine we have a simple blog application consisting of Blog, Post, and User models. As expected, each post belongs to a specific user and the model has the requisite foreign key to the User table. When we view a Post’s assoicated user in the admin site, however, we see the following:

<flask_sqlalchemy.user object at 0x10d3cea10>

To provide a more useful representation in the admin, we extend the reflected class by creating a models.py file and adding functionality to our model classes. Deriving from sandman2.AutomapModel accomplishes this:

from sandman2 import AutomapModel

class User(AutomapModel):

    """A user of the blogging application."""

    __tablename__ = 'user'

    def __unicode__(self):
        return self.name


class Blog(AutomapModel):

    """An online weblog."""

    __tablename__ = 'blog'

    def __unicode__(self):
        return self.name

class Post(AutomapModel):

    """An individual blog post."""

    __tablename__ = 'post'

    def __unicode__(self):
        return self.title

Notice that you can refer to attributes of the class that you know to be present (like user.name) without defining the name column; all other columns/properties are reflected. You’re meerly extending the existing model class.