Что такое django rest framework
Django REST Framework: REST API на Python с нуля
1. Знакомство с REST
Термин REST API расшифровывается как Representational State Transfer Application Programming Interface. Следовательно, RESTful API — это программный интерфейс приложения, соответствующий ограничениям архитектурного стиля REST.
REST — не протокол и не стандарт. Это, как уже было сказано, архитектурное ограничение. Чтобы API считался RESTful, он должен соответствовать следующим критериям.
Благодаря вышеперечисленным архитектурным правилам REST API масштабируемый, переносимый и гибкий.
2. Что такое Django REST Framework?
Django — масштабируемый полнофункциональный веб-фреймворк, написанный на Python. Django берет на себя все хлопоты, зачастую связанные с веб-разработкой, такие как безопасность и доступ к базам данных.
Существует множество библиотек для Django, расширяющих его функционал. Одна из них, о которой мы поговорим сегодня, — это Django REST Framework или DRF, которая позволяет сериализовать данные из Django ORM через REST API.
Сериализация — это преобразование таблиц из базы данных в формат JSON.
Руководство написано для новичков, прошлый опыт работы с фреймворком Django не предполагается, так как вы многому научитесь прямо сейчас. Кроме того, в статье не будет обширного описания технических нюансов каждой операции. Рассматривайте руководство в качестве упражнения.
Давайте создадим сайт бронирования отелей! Исходный код и справка доступны на GitHub.
3. Установка Django
Прежде чем приступить непосредственно к работе с REST API, сделаем краткий экскурс в Django.
Web API с помощью Django REST framework
Веб-cервис (англ. web service) — идентифицируемая веб-адресом программная система со стандартизированными интерфейсами. Веб-службы могут взаимодействовать друг с другом и со сторонними приложениями посредством сообщений, основанных на определённых протоколах (XML, JSON и т. д.). Веб-служба является единицей модульности при использовании сервис-ориентированной архитектуры приложения.
Одним из подходов создания веб сервиса является rest.
Rest (сокр. англ. Representational State Transfer, «передача состояния представления») — стиль построения архитектуры распределенного приложения. Данные в REST должны передаваться в виде небольшого количества стандартных форматов (например HTML, XML, JSON). Сетевой протокол (как и HTTP) должен поддерживать кэширование, не должен зависеть от сетевого слоя, не должен сохранять информацию о состоянии между парами «запрос-ответ». Утверждается, что такой подход обеспечивает масштабируемость системы и позволяет ей эволюционировать с новыми требованиями.
Django REST framework — удобный инструмент для работы с rest основанный на идеологии фреймворка Django.
Требования к окружению:
Python (2.6, 2.7)
Django (1.3, 1.4, 1.5)
Установка
Установить можно привычной для нас командой pip:
И можно поставить дополнительные пакеты:
Или же сделать клон проекта с Github:
Не забываем прописать приложение в INSTALLED_APPS:
А также добавить запись в urls.py:
Url можно ставить любой на Ваш вкус, главное подключить файл с урлами rest framework (rest_framework.urls).
Пример использования
Создадим API для работы с пользователями и их группами.
Для начала нам нужно определить некоторые Serializers, которые мы будем использовать
Пропишем views.py
Мы создали функцию api_root, которая будет отправной точкой для нашего API. И четыре класса, для связи с моделями и указали какие serializers нужно при этом использовать.
Добавим ссылки в urls.py
Важный момент использование user-detail и group-detail. Для корректной связи с views.py нужно использовать именование вида
В format_suffix_patterns мы указали суфикс для наших urls.
Settings
Результат
Используя curl в консоли испытаем что же получилось:
В браузере можно увидить что то подобное:
Быстрый старт¶
Мы собираемся создать простой API, который позволит пользователям-администраторам просматривать и редактировать пользователей и группы в системе.
Настройка проекта¶
Схема проекта должна выглядеть следующим образом:
Может показаться необычным, что приложение было создано в каталоге проекта. Использование пространства имен проекта позволяет избежать столкновения имен с внешними модулями (эта тема выходит за рамки данного краткого руководства).
Теперь синхронизируйте вашу базу данных в первый раз:
После того как вы настроили базу данных и создали начального пользователя, откройте каталог приложения и приступайте к кодированию…
Сериализаторы¶
Просмотры¶
Хорошо, тогда нам лучше написать несколько представлений. Откройте tutorial/quickstart/views.py и начинайте печатать.
При необходимости мы можем легко разбить их на отдельные представления, но использование наборов представлений позволяет хорошо организовать логику представления, а также сделать ее очень лаконичной.
URL-адреса¶
Итак, теперь давайте подключим URL API. Переходим к tutorial/urls.py …
Поскольку мы используем наборы представлений вместо представлений, мы можем автоматически генерировать URL conf для нашего API, просто зарегистрировав наборы представлений в классе маршрутизатора.
Опять же, если нам нужен больший контроль над URL API, мы можем просто опуститься до использования обычных представлений на основе классов и явного написания URL conf.
Наконец, мы включаем представления входа и выхода по умолчанию для использования с просматриваемым API. Это необязательно, но полезно, если ваш API требует аутентификации, а вы хотите использовать просматриваемый API.
Пагинация¶
Пагинация позволяет вам контролировать количество возвращаемых объектов на странице. Чтобы включить ее, добавьте следующие строки в tutorial/settings.py
Настройки¶
Хорошо, мы закончили.
Тестирование нашего API¶
Теперь мы готовы протестировать созданный нами API. Давайте запустим сервер из командной строки.
Теперь мы можем получить доступ к нашему API как из командной строки, используя такие инструменты, как curl …
Или непосредственно через браузер, перейдя по URL http://127.0.0.1:8000/users/ …
Если вы работаете через браузер, обязательно войдите в систему, используя элемент управления в правом верхнем углу.
Отлично, это было легко!
Что такое Django REST Framework?
Я написал эту статью, чтобы рассказать в ней теорию, которая будет необходима для изучения Django REST Framework. Информация, изложенная в этой статье, не является исчерпывающей в данной теме и показывает историю развития веб-приложений лишь отчасти. Я просто постараюсь объяснить, почему этот фреймворк — часть естественной эволюции веб-технологий, и как при помощи него мы можем по-новому решать старые задачи веб-разработки.
Чтобы ответить на вопрос, что же такое Django REST Framework, нужно разобраться со всей необходимой терминологией.
Framework
Создавая приложение или любой другой программный продукт, мы хотим делать это быстро и качественно. Проще этого добиться, используя опыт и наработки других разработчиков, ведь многие задачи, которые мы встречаем в процессе работы, уже были кем-то решены. По сути, использование фреймворка позволяет сосредоточится на задачах бизнеса и не задумываться над техническими деталями там, где это возможно. Нужно отрисовать кнопку на сайте? Сделать авторизацию или сброс пароля? Сохранить данные пользователя из формы на сайте в базу данных? Для этого всё уже готово — бери и пользуйся!
Также важно понимать отличия Framework от библиотеки. Это похожие вещи. В обоих случаях в Python вы должны установить нужный пакет, импортировать и пользоваться им. Разница в том, что библиотеку в проекте вы используете там, где нужно, и так, как вы хотите, а фреймворк сам определяет способ разработки приложения, то есть не только предоставляет удобные инструменты разработки в виде вспомогательных функций и классов, но и непосредственно формирует архитектуру проекта, создает структуру кода, проще говоря, определяет путь, по которому вы будете создавать свое приложение.
Django
На сегодняшний день наиболее функциональным фреймворком для создания веб-приложений на языке Python является фреймворк Django. Django можно назвать MVC-фреймворком, так он реализует взаимодействие пользователя и системы:
Model (хранит данные пользователя)
View (отображает данные пользователя)
Controller (принимает изменения данных от пользователя).
Внутри Django эта терминология звучит немного иначе, но суть остается той же.
Разработка Django началась в 2003 году программистами Adrian Holovaty и Simon Willison, а публичный релиз состоялся в 2005 году. Функционал фреймворка хорошо отвечал требованиям в веб-разработке того времени. Он активно развивается и до сих пор. Хотя этот фреймворк и считается довольно крупным и многофункциональным, сам по себе он не мог удовлетворить все запросы веб-разработчиков. За время его существования сторонними разработчиками было создано огромное множество библиотек и фреймворков в качестве дополнений к Django, которые упрощают реализацию тех или иных задач: аутентификация через социальные сети, кеширование данных, хранение файлов в облаке и многое другое. Некоторые из дополнений со временем сами стали частью проекта Django, как это произошло с библиотекой South, управляющей миграциями базы данных. Но большинство дополнений так и остались независимыми пакетами. Одним из них и является Django REST Framework, при помощи которого мы можем создавать Web API на основе Django.
Web API
Сегодня сеть интернет построена по принципу Клиент-Серверного взаимодействия. Клиент посылает запрос — Сервер ему отвечает. В случае, когда между собой общаются два Сервера, мы условно называем Клиентом того, который отправил запрос и ожидает ответ, а Сервером будет тот, кто принимает запрос и отвечает не него. Взаимодействие браузеров и веб-сайтов (первые выступают в роли Клиента, а вторые в роли Сервера) традиционно делалось при помощи технологии html-рендеринга, именно так изначально это делал Django. Чтобы получить данные с веб-сайта, браузер отправляет запрос GET к Серверу. Сервер формирует ответ в виде html-страницы и передает ее браузеру. Так Сервер передает данные браузеру, но как браузер может передать данные Серверу? В этой самой html-странице Сервер заложил все необходимые веб-формы, заполнив которые, пользователь мог бы передать свои данные обратно на сервер. Когда вы ввели свои данные в форму на сайте, бразуер отправляет Серверу запрос POST, в котором содержатся ваши данные, а Сервер обрабатывает их и записывает в базу данных.
Все это отлично работало, но уже в середине нулевых такой подход перестал удовлетворять возрастающим требования в веб-разработке. Появлялись мобильные приложения, различные гаджеты с доступом в интернет, и для них уже не подходил стандартный способ html-рендеринга на сервере, ведь теперь каждому клиенту нужно было отрисовать данные по-своему. Постоянно увеличивалось взаимодействие серверов друг с другом, и html-формат уже не подходил. Для всех этих задач есть другой способ обмена данными — Web API. Смысл этого способа в том, что Сервер передает Клиенту не html-страницу, а непосредственно данные, никак не влияя на то, как эти данные будут в итоге представлены. Наиболее популярными форматами для передачи данных становятся XML и JSON. Таким образом Сервер полностью избавляется от задачи отрисовки данных. Какое-то время длился переходный период, когда разработчикам веб-приложений на Сервере приходилось поддерживать оба способа одновременно: html рендерился на Сервере для браузеров, а Web API использовался для мобильных приложений и интеграции с другими серверами. Понятно, что разработчикам приложений на Сервере приходилось делать двойную работу. Но в начале десятых ситуация стала меняться в пользу Web API. Этому способствовало молниеносное развитие инструментов на языке JavaScript, а также появление различных веб-фреймворков, одним из которых и является предмет данной статьи.
Браузерные приложения быстро научились отрисовывать веб-страницы самостоятельно, получая чистые данные с Сервера. Веб-приложения на сервере научились создавать API быстро и легко. Так сформировалась четкое разделение на Backend и Frontend разработку: тех, кто поддерживает приложение на Сервере, и тех, кто делает браузерные (клиентские) приложения. А Web API стал универсальным способом общения для Сервера и всех его клиентов (браузеров, мобильных приложений, других Серверов). Конечно, это не могло не привести к развитию стандартов в общении между системами. И Клиенту, и Серверу необходимо знать каким образом общаться с друг с другом, как передавать данные, как сообщать об ошибках. Разработчики всегда могли договориться о том, как взаимодействовать их приложениям, но наличие некоего стандарта в веб-разработке позволило бы эту задачу облегчить. И вот в начале десятых таким стандартом стала концепция REST.
В 2000 году Рой Филдинг написал докторскую диссертацию, где изложил концепцию REST. Там были рекомендации о том, как спроектировать Сервер, чтобы ему было удобно общаться с Клиентами. Выделю два главных принципа создания приложений в стиле REST:
На данный момент мы можем найти фреймворк для создания приложений в стиле REST практически для каждого языка программирования, используемого в веб-разработке. Логика построения Web API на Сервере в этих фреймворках реализована одинаково.
Действия для управления данными привязаны к определенным HTTP-методам. Существует несколько стандартных действий для работы с данными — это Create, Read, Update, Delete. Часто их обобщают как CRUD.
У нас есть объект Кошка, и мы хотим создать запись о кошке на Сервере. Для этого мы отправляем запрос на сервер:
С данными в теле запроса
Плюс к этому запросу (и все другим) будет добавлен ключ аутентификации.
Ключ будет нужен, чтобы Сервер понял, что запрос происходит от авторизованного Клиента. Как мы помним из правила REST, каждый запрос от Клиента должен содержать всю необходимую информацию для обработки этого запроса Сервером. Здесь это правило работает: Сервер ничего не знает о Клиенте до запроса, но сам запрос содержит ключ авторизации, по которому Сервер определяет, что это за Клиент.
Сервер ответит на этот запрос вот таким сообщением:
Сервер взял все поля, переданные клиентом, и добавил к ним поле Id. Здесь работает правило REST, согласно которому каждый ресурс должен иметь уникальный идентификатор и быть доступным по определенному URL. Сервер создал ресурс и вернул нам его Id.
Теперь мы можем получить данную запись по URL
Что, если Клиент хочет изменить созданные им данные на сервере?
Метод PUT используется для изменения данных. Номер 21 в URL говорит о том, какой именно объект нужно изменить. Теперь наша кошка имеет цвет “Black”.
Для удаления записи на Сервере достаточно отправить запрос:
Тут также мы указываем в Id объекта в URL, но передавать никаких данных в теле запроса для удаления объекта уже не требуется.
Django REST Framework
Наконец, мы добрались до главной темы этой статьи. Мы вкратце разобрали каждый компонент этого словосочетания и теперь сможем понять, зачем использовать этот фреймворк, и какие задачи он решает.
Тут я бы хотел процитировать слова Тома Кристи, создателя Django REST Framework.
“Неудивительно, что Django REST framework — это API фреймворк для Django. И он пытается заполнить все пробелы в том, как исторически был спроектирован веб-фреймворк Django”.
И действительно, пусть Django был спроектирован давно, он до сих отлично решает свои задачи. Однако с появлением новых требований в веб-разработке, отсутствие компонентов для создания Web API воспринимается как пробел.
Django REST framework способен этот пробел заполнить.
А мы уже заполнили все пробелы в теории и терминологии и готовы перейти к практике!
Мы рассказываем, как стать более лучшим разработчиком, как поддерживать и эффективно применять свои навыки. Информация о вакансиях и акциях эксклюзивно для более чем 8000 подписчиков. Присоединяйся!
Создайте REST API за 30 минут с помощью Django REST Framework
Почему REST API?
Прежде чем мы перейдем к коду, стоит подумать, зачем вам создавать API. Если бы кто-нибудь объяснил мне эти основные концепции до того, как я начал, мне было бы намного лучше.
Есть несколько ключевых вариантов запроса REST API:
Например, в веб-разработке многие приложения полагаются на REST API, чтобы интерфейсная часть могла взаимодействовать с серверной частью. Например, если вы развертываете приложение React поверх Django, вам понадобится API, чтобы React мог получать информацию из базы данных.
Процесс запроса и преобразования значений табличной базы данных в JSON или другой формат называется сериализацией. При создании API правильная сериализация данных является основной проблемой.
Почему Django REST Framework?
Самая большая причина использовать Django REST Framework заключается в том, что он упрощает сериализацию!
В Django вы определяете свои модели для своей базы данных с помощью Python. Хотя вы можете писать необработанный SQL, по большей части Django ORM обрабатывает все миграции и запросы базы данных.
Думайте о Django ORM как о библиотекаре, который собирает необходимую вам информацию, чтобы вам не приходилось искать ее самостоятельно.
Как разработчик, вы можете не беспокоиться о бизнес-логике вашего приложения и забыть о деталях реализации на низком уровне. Django ORM сделает все за вас.
Таким образом, Django REST Framework прекрасно работает с Django ORM, который уже выполняет всю тяжелую работу по запросам к базе данных. Всего несколько строк кода с использованием Django REST Framework, и вы можете сериализовать свои модели баз данных в форматы REST-ful.
Список пунктов для создания REST API в Django
Итак, исходя из того, что мы знаем, каковы шаги по созданию REST API?
Если это кажется простым, это потому, что это так. Поехали!
1. Настройка Django
Чтобы создать приложение Django, нам нужно установить Django. Это достаточно просто!
Однако сначала рассмотрите возможность создания новой виртуальной среды для вашего проекта, чтобы вы могли управлять своими зависимостями отдельно.
Вот видео этих шагов (но с другим названием проекта), если вы визуально обучаетесь: Видеурок «Создание Django приложения», Начинаем Django приложение правильно
1.1 Virtual Environment
Я использую pyenv и pyenv-virtualenv для своих сред:
1.2 Установка Django
Теперь мы можем установить Django:
Затем давайте начнем новый проект Django:
Если мы сейчас посмотрим на каталог, то увидим, что Django создал для нас новую папку:
И если мы заглянем в эту папку, там есть все, что нам нужно для запуска сайта Django:
Давай убедимся, что это работает. Тестовый запуск сервера Django:
1.3 Создание приложения API
Мы могли бы создать наше приложение со структурой папок, как сейчас. Однако лучше всего разделить проект Django на отдельные приложения, когда вы создаете что-то новое.
Итак, давайте создадим новое приложение для нашего API:
1.4 Зарегистрируйте приложение myapi в проекте mysite
Нам нужно сказать Django, чтобы он распознал это новое приложение, которое мы только что создали. Шаги, которые мы сделаем позже, не сработают, если Django не знает о myapi.
Итак, редактируем mysite/settings.py :
1.5 Перенести базу данных
Помните, как я сказал, что Django позволяет определять модели баз данных с помощью Python?
Каждый раз, когда мы создаем или вносим изменения в модель, нам нужно указать Django перенести эти изменения в базу данных. Затем Django ORM записывает для нас все команды SQL CREATE TABLE.
Оказывается, Django поставляется с несколькими уже встроенными моделями. Нам нужно перенести эти встроенные модели в нашу базу данных.
Итак, давайте перенесем эти исходные модели:
1.6 Создать суперпользователя
Еще одна вещь, прежде чем мы продолжим.
Мы собираемся создать несколько моделей. Было бы неплохо, если бы у нас был доступ к красивому интерфейсу администратора Django, когда мы хотим просматривать данные в нашей базе данных.
Для этого нам потребуются учетные данные для входа. Итак, давайте сделаем себя владельцами и администраторами этого проекта. ВСЕМОГУЩЕГО СУПЕРПОЛЬЗОВАТЕЛЯ.
Убедимся, что это работает. Запустите сервер Django:
А затем перейдите на localhost:8000/admin
Войдите в систему со своими учетными данными суперпользователя, и вы должны увидеть панель администратора:
2. Создайте модель в базе данных, которой будет управлять Django ORM.
Сделаем нашу первую модель!
2.1 myapi/models.py
Создадим базу супергероев! У каждого героя есть имя и псевдоним, которым они пользуются в обычной жизни. Начнем с нашей модели:
2.2 Сделайте миграции
Помните, что всякий раз, когда мы определяем или изменяем модель, нам нужно указать Django перенести эти изменения.
2.3 Зарегистрируйте Hero на сайте администратора
Помните тот замечательный админский сайт, который поставляется прямо из коробки с Django?
Откройте myapi/admin.py и сделайте так:
Теперь запустим сервер Django:
2.4 Создайте новых героев
Пока мы находимся на сайте администратора, можно создать несколько героев, чтобы поиграть с ними в нашем приложении.
Нажмите «Добавить» и создайте своих героев!
3. Настройте Django REST Framework.
Хорошо, пора задуматься о нашем API героев. Нам нужно сериализовать данные из нашей базы данных через конечные точки.
Для этого нам понадобится Django REST Framework, так что давайте установим его.
Теперь скажите Django, что мы установили REST Framework в mysite/settings.py :
4. Сериализация модели героя
Теперь мы начинаем открывать новые горизонты. Нам нужно сообщить REST Framework о нашей модели Hero и о том, как она должна сериализовать данные.
В этом файле нам необходимо:
5. Отображение данных
Теперь все, что осталось сделать, это подключить URL-адреса и представления для отображения данных!
5.1 Представления
Начнем с представления. Нам нужно отрендерить разных героев в формате JSON.
Для этого нам необходимо:
5.2 URL-адреса
Вы увидите, что URL-адрес сайта администратора уже присутствует. Теперь нам просто нужно добавить URL-адрес для нашего API. А пока давайте просто поместим наш API в индекс:
5.3 URL для API
Маршрутизатор REST Framework будет следить за тем, чтобы наши запросы динамически попадали в нужный ресурс. Если мы добавим или удалим элементы из базы данных, URL-адреса обновятся, чтобы соответствовать. Круто, правда?
Конечно, если вы хотите использовать только стандартные представления DRF вместо наборов представлений, urls.py будет выглядеть немного иначе. Для использования простых представлений маршрутизатор не нужен, их можно просто добавить с помощью:
Проверьте!
Снова запустите сервер Django:
Теперь перейдите на localhost:8000
Посетите конечную точку через GET
GET для индивидуального героя
Мы можем запросить с помощью GET единственный экземпляр модели, используя его ID.
viewsets представлений Django REST Framework позаботятся об этом за нас.
Например, http://127.0.0.1:8000/heroes/1/ для меня возвращает:
Теперь список героев выглядит так:
Мы можем использовать эти идентификаторы для поиска отдельных моделей.
Отправить запрос POST
Наш API также обрабатывает POST запросы. Мы можем отправить JSON в API, и он создаст новую запись в базе данных.
Теперь в нашем API есть Капитан Америка!
Быстрые API REST с Django REST Framework
Надеюсь, вам понравился этот краткий урок. Конечно, API-интерфейсы могут значительно усложниться из-за пересечения нескольких моделей и конечных точек с более сложными запросами.
Тем не менее, вы хорошо продвигаетесь с этим постом. REST Framework довольно хорошо справляется со сложностью. Если вы застряли, есть отличное сообщество, готовое помочь вам найти решение.