DEV Community

Apcelent
Apcelent

Posted on

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.

Alt text of 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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)

                    ]
                }
Enter fullscreen mode Exit fullscreen mode

Running the application

Create the database schema by executing:

python initialize_db.py
Enter fullscreen mode Exit fullscreen mode

Start the development server by:

python setup.py develop
pserve note.ini --reload
Enter fullscreen mode Exit fullscreen mode

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')
Enter fullscreen mode Exit fullscreen mode

The source code can be found on github

Hope the article was of help!

The article originally appeared on Apcelent Tech Blog.

Top comments (0)