Создание API с помощью Django в Python
Рассмотрим, как создать простой API в Python, который возвращает список задач и подробную информацию о задаче, используя только Django.
- Создание виртуальной среды
- Создание нового проекта Django
- Создание нового приложения Django
- Определение модели Todo
- Выполнение миграций и миграция моделей
- Создание некоторых задач
- Создание API с помощью 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 в следующих уроках.