В этом уроке, который состоит из двух частей, я расскажу о том, как можно создать и обработать API используя django rest framework и vue.js. В первой части урока мы займемся бэкэндом, во второй – фронтэндом.
Исходный код урока: https://github.com/apirobot/django-vue-simplenote

Настройка
Начнем с установки django и django rest framework (будем считать, что вы уже создали и активировали виртуальное окружение):
$ pip install django djangorestframework
Создадим нашу рабочую папку и папку backend, в которой будет находится проект Django. В дальнейшем мы еще создадим папку frontend, в которой будет наш Vue.js код.
$ mkdir django-vue-simplenote $ cd django-vue-simplenote $ mkdir backend
Создаем новый проект и приложение notes:
$ django-admin startproject simplenote backend/ $ cd backend $ django-admin startapp notes
Добавляем django rest framework и notes в список установленных приложений (INSTALLED_APPS):
# backend/simplenote/settings.py
INSTALLED_APPS = [
    ...
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'notes',
]
Структура проекта должна выглядить примерно так (я удалил ненужные файлы, которые создал django автоматически, при создании приложения notes):
django-vue-simplenote
└── backend
    ├── manage.py
    ├── notes
    │   ├── __init__.py
    │   ├── migrations
    │   │   └── __init__.py
    │   ├── models.py
    │   └── views.py
    └── simplenote
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py
Реализация
Начнем с создания простой модели:
# backend/notes/models.py
from django.db import models
class Note(models.Model):
    title = models.CharField(max_length=255)
    body = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
Теперь давайте напишем сериалайзер (serializer) для нашей модели. Сериализация позволяет нам преобразовать сложную модель из нашей базы данных, в простой тип данных вроде JSON или XML. Этот наш JSON мы затем будем получать и обрабатывать с помощью Vue.js.
# backend/notes/serializers.py
from rest_framework import serializers
from .models import Note
class NoteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Note
        fields = ('id', 'title', 'body', 'created_at')
Создадим представление (view) используя ModelViewSet, который уже снабжает нас create, update, list, retrieve, delete методами:
# backend/notes/views.py
from rest_framework import viewsets
from .models import Note
from .serializers import NoteSerializer
class NoteViewSet(viewsets.ModelViewSet):
    queryset = Note.objects.all().order_by('-created_at')
    serializer_class = NoteSerializer
Так как мы используем ViewSet, то нам нет необходимости самим настраивать URLs. Можно использовать готовый класс Router, который предоставляет django rest framework:
# backend/notes/urls.py from rest_framework import routers from .views import NoteViewSet # Создаем router и регистрируем наш ViewSet router = routers.DefaultRouter() router.register(r'notes', NoteViewSet) # URLs настраиваются автоматически роутером urlpatterns = router.urls
Осталось только включить эти urls в backend/simplenote/urls.py:
# backend/simplenote/urls.py
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
    url(r'^api/v1/', include('notes.urls')),
    url(r'^admin/', admin.site.urls),
]
Запуск
Выполняем миграции и запускаем сервер:
$ python backend/manage.py makemigrations $ python backend/manage.py migrate $ python backend/manage.py runserver
Теперь можно протестировать работу нашего приложения. Для этого сделаем несколько HTTP запросов к нашему API с помощью библиотеки HTTPie.
Сделаем тестовый GET запрос, чтобы проверить, работает ли наше приложение:
http GET "http://localhost:8000/api/v1/notes/"

Создадим новую заметку:
http POST "http://localhost:8000/api/v1/notes/" title="Note #1" body="Description #1"

Проверяем список заметок:
http GET "http://localhost:8000/api/v1/notes/"

На этом все. Можете отдохнуть 🙂
В следующей части урока посмотрим, как можно обработать наш API и отобразить его пользователю с помощью Vue.js.