Создание API с помощью Django в Python

Рассмотрим, как создать простой 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, созданного выше:

django-rest-api сайт администратора

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

Добавление задач

Создание API с помощью Django

Мы создадим API только с Django. API будет иметь две конечные точки:

  1. todos/ возвращает все задачи.
  2. 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)

Как это работает.

  1. Функция todo_list() получает все задачи в виде набора запросов, форматирует его как словарь и возвращает ответ JSON с помощью объекта JSONResponse.
  2. Функция 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 в следующих уроках.

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *