Skip to content

2. REST Framework (tastypie)

Django Tastypie is a third-party Django app that helps build RESTful APIs for your Django project. It simplifies the process of creating web APIs by automatically handling serialization and deserialization, authentication, and more.

Tastypie allows you to expose your Django models or any other data structure as a REST API, making it easier for clients (like mobile apps or front-end frameworks) to communicate with your Django backend.

Key Features of Tastypie:

  1. Easy to use: It simplifies the process of creating a RESTful API in Django.
  2. Model-based resources: You can easily expose Django models as API resources.
  3. Serialization: Automatically serializes and deserializes data into formats like JSON and XML.
  4. Authentication: Tastypie provides built-in support for different authentication schemes such as OAuth, basic authentication, etc.
  5. Customizable: You can easily customize how data is serialized, how resources are exposed, and how permissions are handled.

Installation of django-tastypie

To get started with Tastypie, first, you need to install it in your Django project.

  1. Install django-tastypie using pip:

    Terminal window
    pip install django-tastypie
  2. Add tastypie to your INSTALLED_APPS in settings.py:

    INSTALLED_APPS = [
    # other apps
    'tastypie',
    ]
  3. Run the migrations (though Tastypie doesn’t require any migrations itself, it’s always good to ensure everything is up to date):

    Terminal window
    python manage.py migrate

Basic Usage of Tastypie

Let’s walk through a simple example where we expose a Django model as a REST API.

Step 1: Define a Django Model

We’ll use a simple Book model in this example:

models.py
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
published_date = models.DateField()
def __str__(self):
return self.title

Step 2: Create a Tastypie Resource

Next, we define a Tastypie Resource for the Book model. This resource will expose the Book model as a REST API.

api.py
from tastypie.resources import ModelResource
from tastypie import fields
from .models import Book
class BookResource(ModelResource):
class Meta:
queryset = Book.objects.all() # Define which model to expose
resource_name = 'book' # The name of the resource (used in the URL)
allowed_methods = ['get', 'post', 'put', 'delete'] # Allowed HTTP methods
authentication = ... # Optional: set authentication, e.g., tastypie.authentication.BasicAuthentication
authorization = ... # Optional: set authorization, e.g., tastypie.authorization.Authorization
# You can also specify how fields are serialized if needed

In this BookResource class:

  • queryset specifies the model you want to expose.
  • resource_name determines the name of the endpoint (in this case, the API endpoint will be /api/book/).
  • allowed_methods specifies which HTTP methods are allowed for this resource (GET, POST, PUT, DELETE).

Step 3: Add the Resource to the URL Configuration

Now, you need to wire up the resource to Django’s URL routing system. In urls.py, add the following:

urls.py
from django.urls import path
from tastypie.api import Api
from .api import BookResource
# Create a Tastypie API instance
api = Api(api_name='v1')
# Register your resource with the API
api.register(BookResource())
urlpatterns = [
path('api/', include(api.urls)), # Add the API URLs
]

Now, the /api/book/ endpoint is available to make GET, POST, PUT, or DELETE requests to interact with the Book model.

Step 4: Test the API

You can test the API by running the Django development server:

Terminal window
python manage.py runserver
  • GET request: To get the list of all books, visit http://127.0.0.1:8000/api/v1/book/.

    This will return a JSON response with all the books.

  • POST request: To create a new book, you can use a tool like Postman or curl to send a POST request with JSON data:

    Example request body:

    {
    "title": "New Book",
    "author": "John Doe",
    "published_date": "2023-01-01"
    }
  • PUT request: To update a book, send a PUT request to /api/v1/book/<book_id>/.

  • DELETE request: To delete a book, send a DELETE request to /api/v1/book/<book_id>/.

Step 5: Handle Serialization (Optional)

Tastypie automatically handles basic serialization of model fields. However, you can also customize how data is serialized and deserialized using methods like dehydrate_* (for serialization) and hydrate_* (for deserialization).

For example, you can modify the serialized output of a Book model:

api.py
class BookResource(ModelResource):
class Meta:
queryset = Book.objects.all()
resource_name = 'book'
def dehydrate(self, bundle):
# Modify the serialized data before returning it
bundle.data['custom_field'] = 'Custom Value'
return bundle

Authentication and Authorization

Tastypie supports authentication and authorization, allowing you to restrict access to your API. You can use basic authentication, OAuth, or implement custom authentication logic.

Example of adding basic authentication:

from tastypie.authentication import BasicAuthentication
from tastypie.authorization import Authorization
class BookResource(ModelResource):
class Meta:
queryset = Book.objects.all()
resource_name = 'book'
authentication = BasicAuthentication() # Enable basic authentication
authorization = Authorization() # Basic authorization (everyone can access)