Рассмотрим, как создать простой API в Python, который возвращает список задач и подробную информацию о задаче, используя только Django.
Создание виртуальной среды
- Сначала создайте новый каталог с именем django_rest_api:
mkdir django_rest_api
- Во-вторых, перейдите в каталог django_rest_api:
cd django_rest_api
- В-третьих, создайте виртуальную среду, используя встроенный модуль venv:
python -m venv venv
- В-четвертых, активируйте виртуальную среду:
venv/scripts/activate
- В-пятых, установите пакет django с помощью команды pip:
pip install django
- Наконец, создайте файл requirements.txt:
pip freeze > requirements.txt
Создание нового проекта Django
Сначала создайте новый проект Django под названием todolist:
django-admin startproject todolist
Затем перейдите в каталог проекта:
cd todolist
Создание нового приложения Django
Создайте новое приложение под названием todo внутри проекта todolist:
django-admin startapp todo
Зарегистрируйте приложение todo в settings.py проекта todolist.
INSTALLED_APPS = [
...
'todo.apps.TodoConfig',
]
Определение модели Todo
Определите модель Todo в файле models.py приложения todo:
from django.db import models
from django.contrib.auth.models import User
class Todo(models.Model):
title = models.CharField(max_length=255)
completed = models.BooleanField(default=False)
user = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.title
Модель Todo имеет три поля: title, completed и user.
Пользователь ссылается на модель User пакета django, которая указывает учетную запись, создавшую задачу.
Во-вторых, зарегистрируйте модель Todo на сайте администратора, изменив код в admin.py в приложении todo:
from django.contrib import admin from .models import Todo admin.site.register(Todo)
Сделав это, вы сможете управлять задачами на сайте администратора Django.
Выполнение миграций и миграция моделей
- Сначала выполните новую миграцию:
python manage.py makemigrations
- Во-вторых, выполните миграцию, чтобы синхронизировать модели с базой данных:
python manage.py migrate
- В-третьих, создайте пользователя с правами суперадминистратора для входа на сайт администратора Django:
python manage.py createsuperuser
Назовем пользователя john.
- Наконец, запустите сервер разработки Django:
python manage.py runserver
Создание некоторых задач
Сначала войдите на сайт администратора по URL-адресу http://localhost:8000/admin, используя суперпользователя john, созданного выше:

И добавьте несколько задач:

Создание API с помощью Django
Мы создадим API только с Django. API будет иметь две конечные точки:
- todos/ возвращает все задачи.
- todos/id возвращает информацию о конкретном todo, указанном по id. Например, todos/1 возвращает информацию о todo с id 1.
- Сначала создайте две функции представления внутри views.py приложения todo:
from django.http import JsonResponse
from django.core.exceptions import ObjectDoesNotExist
from .models import Todo
def todo_list(request):
""" Return all todos
"""
# get all todos
todos = Todo.objects.all()
# prepare data to return
data = {'todos': list(todos.values())}
# return JSON
return JsonResponse(data)
def todo_detail(request, pk):
""" Return a todo instance
"""
try:
# find todo by id
todo = Todo.objects.get(pk=pk)
except ObjectDoesNotExist:
# return 404 if the todo does not exists
return JsonResponse({
'status_code': 404,
'error': f'Todo with id {pk} not found.'
})
else:
# prepare data to return
data = {
'id': todo.id,
'title': todo.title,
'completed': todo.completed,
'user': todo.user.username,
}
# return JSON
return JsonResponse(data)
Как это работает.
- Функция todo_list() получает все задачи в виде набора запросов, форматирует его как словарь и возвращает ответ JSON с помощью объекта JSONResponse.
- Функция todo_detail() получает todo по идентификатору и возвращает ответ JSON с кодом 404, если todo не существует. В противном случае она возвращает детали модели todo, включая информацию об имени пользователя.
- Во-вторых, создайте urls.py внутри приложения todo и включите его в urls.py проекта:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('todo.urls')), # new
]
urls.py сопоставляет конечные точки API с представлениями функций:
from django.urls import path
from .views import todo_list, todo_detail
urlpatterns = [
path('todos/', todo_list, name="todo-list"),
path('todos/<int:pk>', todo_detail, name="todo-detail"),
]
- В-третьих, откройте конечную точку http://localhost:8000/todos/ в веб-браузере, вы увидите три задачи в формате JSON:
{
"todos": [
{
"id": 1,
"title": "Learn Python",
"completed": false,
"user_id": 1
},
{
"id": 2,
"title": "Study Django",
"completed": false,
"user_id": 1
},
{
"id": 3,
"title": "Master Django REST API",
"completed": false,
"user_id": 1
}
]
}
- В-четвертых, откройте конечную точку идентификатора todo 1 http://localhost:8000/todos/1, и вы увидите следующий ответ JSON:
{
"id": 1,
"title": "Learn Python",
"completed": false,
"user": "john"
}
- Наконец, если вы откроете несуществующую конечную точку, например http://localhost:8000/todos/10, вы получите ошибку 404:
{
"status_code": 404,
"error": "Todo with id 10 not found."
}
Как видите, Django способен строить API. Но для сериализации экземпляров моделей Django в JSON и наоборот требуются большие усилия. Кроме того, если вы хотите добавить больше функций в API, таких как разбиение на страницы, ограничение скорости, аутентификация по токенам и т. д., Django не предоставляет все эти функции «из коробки».
Вот почему Django REST Framework вступает в игру. Мы узнаем, как разработать полностью RESTful API с использованием Django REST Framework в следующих уроках.
