Как написать простой веб-сервис с помощью Django REST

IT-копирайтер
Время чтения: 3 минуты
Разработка веб-приложений и других веб-проектов в нашей команде часто проходит с использованием фреймворка Django, и сегодня я расскажу почему. Экономя время занятым читателям, скажу сразу и в двух словах: простота, скорость (создания веб-приложений). А для тех, кому интересна техническая сторона: что, для чего и как — я распишу шаги создания нехитрого веб-сервиса.
Что такое Django?
Django — это высокоуровневый веб-фреймворк для языка Python, позволяющий быстро разрабатывать динамические веб-приложения.
Изначально Django был разработан для написания новостных сайтов, поэтому основным требованием было решение двух проблем:
- регулярное интенсивное наполнение сайта материалом по требованию редакции;
- соответствие высоким стандартам качества сайта.
В результате у нас есть удобный фреймворк, который существенно ускоряет процесс разработки и дает возможность разделить процессы программирования, верстки и дизайна. По сути, Django можно назвать каркасом веб-приложений.
Одним из основных принципов Django является DRY (Don’t Repeat Yourself), что в переводе с английского означает «Не повторяйся», который нацелен на устранение повторений в коде.
Для чего нужен Django REST Framework?
Как понятно из названия, Django REST Framework — это лёгкий фреймворк для Django, поддерживающий идеологию REST (Representational State Transfer) — репрезентативную передачу состояния. Использование этого фреймворка позволяет легко стандартизировать запросы к базе данных и одновременно создавать RESTful WEB API нашего сайта.
Особенности:
- Отображение ресурсов с использованием новой функции Django — Class Based Views.
- Поддержка ModelResources и проверка входных данных.
- Наличие подключаемых парсеров, отображений, авторизации и прав доступа — все легко настраивается.
- Указание типа материала с использованием Access в заголовках HTTP-запросов.
- Поддержка форм с возможностью проверки.
Итак, переходим к созданию простейшего приложения для демонстрации скорости разработки с использованием Django REST Framework.
Установку и настройку Python, Django я пропускаю, так как по этому поводу в Интернете материала очень много. Для начала нам необходимо создать проект. Делается это командой
django-admin.py startproject blogpost
Имя нашего проекта будет BlogPost. Команда автоматически создаст каталог проекта и некоторые необходимые нам файлы по умолчанию. Далее нам необходимо создать модели наших таблиц в базе данных. Для этого редактируем файл models.py:
from django.db import models class BlogPost(models.Model): title = models.CharField(max_length=128) content = models.TextField() created = models.DateTimeField(auto_now_add=True) class Comment(models.Model): blogpost = models.ForeignKey(BlogPost, editable=False, related_name='comments') comment = models.TextField() created = models.DateTimeField(auto_now_add=True)
Мы создали две таблицы BlogPost и Comment. На самом деле в базе данных они буду именованы не так, но мы работает только с ORM, поэтому нам об этом заботится не надо. Далее создадим файл ресурсов resource.py содержащий следующее:
from django.core.urlresolvers import reverse from djangorestframework.resources import ModelResource from blogpost.models import BlogPost, Comment class BlogPostResource(ModelResource): model = BlogPost fields = ('created', 'title', 'content', 'url', 'comments',) ordering = ('-created',) def comments(self, instance): return reverse('comments', kwargs={'blogpost':instance.id}) class CommentResource(ModelResource): model = Comment fields = ('created', 'comment', 'url', 'blogpost',) ordering = ('-created',) def blogpost(self, instance): return reverse('blog-post', kwargs={'id':instance.blogpost.id})
Итак, мы создали модели ресурсов, с которыми потом будут работать представления. Мы указали необходимые для вывода поля, добавили методы для вычислимых молей (в нашем примере это ссылки).
Далее необходимо добавить ссылки в urls.py. Ссылка создается с помощью регулярного выражения и ассоциируется с необходимым представлением и моделью ресурсов:
from django.conf.urls.defaults import patterns, url from djangorestframework.views import ListOrCreateModelView, InstanceModelView from blogpost.resources import BlogPostResource, CommentResource urlpatterns = patterns('', url(r'^$', ListOrCreateModelView.as_view(resource=BlogPostResource), name='blog-posts-root'), url(r'^(?P<id>[^/]+)/$', InstanceModelView.as_view(resource=BlogPostResource), name='blog-post'), url(r'^(?P<blogpost>[^/]+)/comments/$', ListOrCreateModelView.as_view(resource=CommentResource), name='comments'), url(r'^(?P<blogpost>[^/]+)/comments/(?P<id>[^/]+)/$', InstanceModelView.as_view(resource=CommentResource)), )
Представления имеют говорящие названия. Теперь в файле settings.py добавим описание базы данных:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 'NAME': 'database.sqlite3', # Or path to database file if using sqlite3. 'USER': '', # Not used with sqlite3. 'PASSWORD': '', # Not used with sqlite3. 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. 'PORT': '', # Set to empty string for default. Not used with sqlite3. } }
Для упрощения используем sqlite3. Список приложений (settings.py) необходимо привести к следующему виду:
INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'djangorestframework', 'blogpost', # Uncomment the next line to enable the admin: # 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', )
Тем самым мы описали, что наше приложение BlogPost включено в проект, а приложение djangorestframework нам необходимо для того, что бы django смог подключить тестовые шаблоны для вывода данных. Запускаем следующую команду:
python manage.py syncdb
Эта команда создаст базу данных и необходимые в ней таблицы, после этого можно запускать проект и прямо с браузера тестировать серверное API:
python manage.py runserver 0.0.0.0:8000
Каким же функционалом обладает наш сервис?
- При вызове GET http://localhost:8000 запроса нам возвращается список постов, если они есть.
- При вызове POST http://localhost:8000 и отправке данных, таких как title и content, мы создаем новые посты.
- Если у нас уже существует пост, например id = 3, то при вызове GET http://localhost:8000/comments нам вернется список комментариев к этому посту.
- Отправка POST http://localhost:8000/3/comments с необходимыми данными создаст новый комментарий.
- Также можно вызывать OPTIONS http://localhost:8000/3/comments, OPTIONS http://localhost:8000/, который вернет формат данных.
- Что бы изменить какой-то пост, например id = 5, мы отправляем PUT http://localhost:8000/5/ с необходимыми данными, то же самое можно делать с комментариями.
- Всё это можно тестировать при помощи браузера, так как браузер передает в заголовке Accept (html/text) и фреймворк автоматически использует тестовые шаблоны для отображения и управления данными.
Django в веб-разработке — большая тема, и о ней можно рассказывать много и долго, моей же целью было продемонстрировать, насколько он удобный и практичный. Если он вас тоже заинтересовал, у проекта есть замечательный сайт с английской документацией. Успешных вам проектов!
Комментарии