Python > Web Development with Python > Django > Django REST Framework (for building APIs)
Simple API Endpoint with Django REST Framework
This snippet demonstrates creating a basic API endpoint using Django REST Framework (DRF). It shows how to serialize data and return it as JSON.
Setting up the Serializer
Serializers in DRF are responsible for converting Python objects into data types that can be easily rendered into JSON. This serializer defines the fields 'id', 'name', and 'description'. The 'id' field is read-only, meaning it's not used for creating or updating objects, only for displaying their value.
from rest_framework import serializers
class ItemSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
name = serializers.CharField(max_length=200)
description = serializers.CharField(max_length=500)
Creating the API View
This code defines an API view, ItemList
, that handles GET and POST requests. The get
method serializes a list of items and returns it as a JSON response. The post
method deserializes data from the request, validates it using the serializer, and (ideally) saves the data to a database. If the data is valid, it returns the serialized data with a 201 Created status; otherwise, it returns validation errors with a 400 Bad Request status.
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
# Sample Data (replace with your actual data source)
items = [
{'id': 1, 'name': 'First Item', 'description': 'This is the first item.'},
{'id': 2, 'name': 'Second Item', 'description': 'This is the second item.'}
]
class ItemList(APIView):
def get(self, request):
serializer = ItemSerializer(items, many=True)
return Response(serializer.data)
def post(self, request):
serializer = ItemSerializer(data=request.data)
if serializer.is_valid():
# Save the data (replace with your actual data storage logic)
# items.append(serializer.validated_data) #In real life, update the data in DB
print(serializer.validated_data) #Print the data sent
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
URL Configuration (urls.py)
This snippet shows how to map the ItemList
view to a URL endpoint 'items/'. When a user accesses this URL, the ItemList
view will be executed.
from django.urls import path
from . import views
urlpatterns = [
path('items/', views.ItemList.as_view(), name='item-list'),
]
Concepts Behind the Snippet
Real-Life Use Case
This type of API endpoint can be used to expose a list of products, articles, or any other type of data to client-side applications (e.g., a React frontend) or other services. For instance, an e-commerce site could use this to provide a product catalog to its mobile app.
Best Practices
Interview Tip
Be prepared to discuss the difference between serialization and deserialization, the role of serializers and API views in DRF, and how to handle different HTTP methods (GET, POST, PUT, DELETE) in your API endpoints.
When to Use Them
Use Django REST Framework when you need to build RESTful APIs for web applications. DRF simplifies the process of creating APIs by providing tools for serialization, authentication, and request handling. It's especially useful when you want to decouple your frontend from your backend.
Alternatives
Alternatives to DRF include Flask with Flask-RESTful or Falcon for building APIs. These frameworks are lighter weight than Django and DRF, but require more manual configuration.
Pros
Cons
FAQ
-
What is the purpose of a serializer in Django REST Framework?
A serializer in DRF is responsible for converting Python objects into a data format (typically JSON) that can be easily rendered in an API response. It also handles deserialization, converting incoming data (e.g., from a POST request) into Python objects for use in your application.
-
How do I handle different HTTP methods in an API view?
You can define separate methods within your API view class for each HTTP method you want to support (e.g.,
get
for GET requests,post
for POST requests,put
for PUT requests,delete
for DELETE requests). Each method should handle the specific logic for that type of request.