How to create REST API using Pyramid

Pyramid is a lightweight python web framework following MVC architectural pattern. In this article, we will set up a web application and API using Pyramid.

Pyramid is a suitable framework for large scale MVC applications and it comes with flexible bootstrapping tools.

Cornice, a library from Mozilla, makes it easy to develop RESTful web services with pyramid.

image

Installation

First we create a virtual environment which helps us in separating project specific python packages installations from other projects. After activating the virtual environment, we install pyramid framework using command:

pip install pyramid

Create models

We create a models.py file with a class Note which maps to the data table storing all the values of notes.

# pyramidapp/models.py

class Note(Base):
    __tablename__ = 'Note'
    id = Column(Integer, primary_key=True)
    title = Column(Text)
    description = Column(Text)
    create_at = Column(Text)
    create_by = Column(Text)
    priority = Column(Integer)

    def __init__(self, title, description, create_at ,create_by, priority):
        self.title = title
        self.description = description
        self.create_at = create_at
        self.create_by = create_by
        self.priority = priority

    @classmethod
    def from_json(cls, data):
        return cls(**data)

    def to_json(self):
        to_serialize = ['id', 'title', 'description', 'create_at', 'create_by', 'priority']
        d = {}
        for attr_name in to_serialize:
            d[attr_name] = getattr(self, attr_name)
        return d

Views

In views.py file, we add our services for different API requests.

@resource(collection_path='/notes', path='/notes/{id}')
class NoteView(object):

    def __init__(self, request):
        self.request = request

    def collection_get(self):

        return {
            'notes': [
                {'id': note.id, 'title': note.title, 'description': note.description,
                'create_at': note.create_at, 'create_by': note.create_by, 'priority': note.priority}

                    for note in DBSession.query(Note)

                    ]
            }

    def get(self):

        try:
            return DBSession.query(Note).get(
                int(self.request.matchdict['id'])).to_json()
        except:
            return {}

    def collection_post(self):

        note = self.request.json
        DBSession.add(Note.from_json(note))

    def put(self):
        try:
            obj=DBSession.query(Note).filter(Note.id==self.request.matchdict['id'])
            obj.update(self.request.json)
            return {'notes': [
                    {'id': note.id, 'title': note.title, 'description': note.description,
                    'create_at': note.create_at, 'create_by': note.create_by, 'priority': note.priority}

                        for note in DBSession.query(Note)

                        ]
                    }
        except:
            return {'result': 'No object found'}


    def delete(self):
        obj=DBSession.query(Note).filter(Note.id==self.request.matchdict['id']).first()
        DBSession.delete(obj)

        return {'notes': [
                {'id': note.id, 'title': note.title, 'description': note.description,
                'create_at': note.create_at, 'create_by': note.create_by, 'priority': note.priority}

                    for note in DBSession.query(Note)

                    ]
                }

Running the application

Create the database schema by executing:

python initialize_db.py

Start the development server by:

python setup.py develop
pserve note.ini --reload

We can view the notes by navigating to the URL http://localhost:6543/notes in browser.

Open python shell and execute requests for API:

requests.post('http://localhost:6543/notes',
                 headers={'Content-Type': 'application/json'},
                data=json.dumps({   "title": "sample note one ",
                                    "create_at": "2017-08-23 00:00",
                                    "create_by": "apcelent",
                                    "description": "sample notes",
                                    "priority": 3,

                                }))

requests.put('http://localhost:6543/notes/1',
                 headers={'Content-Type': 'application/json'},
                data=json.dumps({   "title": "sample note edit ",
                                    "create_at": "2017-08-23 00:00",
                                    "create_by": "apcelent",
                                    "description": "sample notes edit",
                                    "priority": 4,

                                }))

requests.delete('http://localhost:6543/notes/1')

The source code can be found on github

Hope the article was of help!

Comments