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

автор Дмитрий Курагин

15 Апр 2013

Часто при создании веб-проектов мы используем фреймворк 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 можно рассказывать много и долго, моей же целью было продемонстрировать, насколько он удобный и практичный. Если он вас тоже заинтересовал, у проекта есть замечательный сайт с английской документацией. Успешных вам проектов!

  • 0 Репосты

Комментарии

Фильтр

Закрыть

Технологии

Индустрии