Adding URLs and Using the DRF API
In this tutorial, we will learn how to configure URLs for your Django Rest Framework (DRF) API and use the API endpoints to interact with your data. We will cover:
- Setting up URLs with DRF routers
- Using the API with HTTP methods
- Testing your API with tools like Postman or cURL
Step 1: Adding URLs with DRF Routers
Why Use Routers?
DRF routers automatically generate URL patterns for your API viewsets. They simplify the process of creating and maintaining URLs for your API, handling common CRUD operations.
Define a ViewSet
Assuming you have already created a viewset for your model in myapp/views.py
, here’s an example:
from rest_framework import viewsets
from .models import User
from .serializers import UserSerializer
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
Configure Routers
Create a urls.py
file in myapp
(if it doesn't already exist) and set up the router to include your viewsets:
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import UserViewSet
router = DefaultRouter()
router.register(r'users', UserViewSet)
urlpatterns = [
path('', include(router.urls)),
]
Include App URLs in the Project
Include your app’s URLs in the main project’s urls.py
:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('myapp.urls')), # Include app URLs
]
Step 2: Using the API with HTTP Methods
Accessing the API Endpoints
With the router set up, you can now access various endpoints for the User
model:
- List Users:
GET /api/users/
- Retrieve a User:
GET /api/users/{id}/
- Create a User:
POST /api/users/
- Update a User:
PUT /api/users/{id}/
- Partial Update a User:
PATCH /api/users/{id}/
- Delete a User:
DELETE /api/users/{id}/
Making HTTP Requests
Using cURL
You can interact with your API using cURL from the command line. Here are some examples:
-
List Users:
curl -X GET http://localhost:8000/api/users/
-
Create a User:
curl -X POST http://localhost:8000/api/users/ -H "Content-Type: application/json" -d '{"name": "Jane Doe", "email": "jane@example.com"}'
-
Retrieve a User:
curl -X GET http://localhost:8000/api/users/1/
-
Update a User:
curl -X PUT http://localhost:8000/api/users/1/ -H "Content-Type: application/json" -d '{"name": "John Smith", "email": "john.smith@example.com"}'
-
Delete a User:
curl -X DELETE http://localhost:8000/api/users/1/
Using Postman
Postman is a popular API client that provides a user-friendly interface for making HTTP requests.
-
Install Postman: Download and install Postman from Postman’s official website.
-
Create a Request:
- Open Postman and create a new request.
- Select the HTTP method (GET, POST, PUT, PATCH, DELETE).
- Enter the API endpoint URL (e.g.,
http://localhost:8000/api/users/
). - Add headers and request body as needed.
-
Send Request:
- Click the "Send" button to make the request.
- Review the response returned by the API.
Step 3: Testing Your API
Writing Automated Tests
Automated tests ensure your API behaves as expected and helps prevent regressions. Django’s testing framework can be used to write tests for your API.
In myapp/tests.py
, you can write tests using DRF’s APITestCase
:
from rest_framework.test import APITestCase
from rest_framework import status
from .models import User
class UserAPITestCase(APITestCase):
def setUp(self):
self.user = User.objects.create(name='John Doe', email='john@example.com')
def test_list_users(self):
response = self.client.get('/api/users/')
self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_create_user(self):
data = {'name': 'Jane Doe', 'email': 'jane@example.com'}
response = self.client.post('/api/users/', data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(User.objects.count(), 2)
def test_retrieve_user(self):
response = self.client.get(f'/api/users/{self.user.id}/')
self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_update_user(self):
data = {'name': 'John Smith', 'email': 'john.smith@example.com'}
response = self.client.put(f'/api/users/{self.user.id}/', data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.user.refresh_from_db()
self.assertEqual(self.user.name, 'John Smith')
def test_delete_user(self):
response = self.client.delete(f'/api/users/{self.user.id}/')
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
self.assertEqual(User.objects.count(), 0)
Running Tests
Run your tests with:
python manage.py test
Conclusion
In this tutorial, we set up URLs for a DRF API using routers, explored how to interact with the API using HTTP methods, and tested our API with tools like cURL, Postman, and Django’s testing framework. This setup allows you to create, read, update, and delete resources through your API effectively.
In the next chapter, we will look into using FastAPI, another powerful option for building APIs with Python, and compare it with DRF. Stay tuned!