В этой серии я ставлю перед собой задачу каждый день создавать API с другим языком/фреймворком, повторять некоторые основы, а также писать серию простых руководств по каждому API. Вчера мы начали с Ruby on Rails, а сегодня мы будем создавать API с помощью rest-framework Django. Как обычно, весь сегодняшний код можно найти здесь.

Как обычно, прежде чем мы начнем, нам нужно установить некоторые зависимости. Для начала следуйте инструкциям здесь (я настоятельно рекомендую этот блог, так как именно им я пользовался, когда впервые начал изучать веб-разработку на Django).

Как и экосистема Node.js NPM и RubyGem от Rails, Python имеет свою экосистему pip, и многие пакеты можно легко установить с помощью команды pip install PACKAGENAMEHERE. После установки Django установите фреймворк RESTful API Django через pip install djangorestframework. После установки перейдите в нужный каталог и запустите новый проект Django через django-admin startproject PROJECTNAMEHERE.

Каждый «компонент» или «функция» в Django называется приложением; то есть, если вы создаете личный веб-сайт, блог может быть приложением, которое является частью проекта, а портфолио может быть другим приложением. Теперь, когда мы создали наш проект, перейдите в проект и создайте приложение через python manage.py startapp APPNAMEHERE.

Теперь, когда мы сформировали проект и приложение в нем, осталась единственная часть конфигурации — перейти к файлу settings.py в подкаталоге с тем же именем, что и у проекта (это «сердце» этого приложения). ) и внесите следующие изменения:

  1. Включите «rest_framework» и «APPNAME.apps.APPNAMEConfig» в массив INSTALLED_APPS. На приведенном выше снимке экрана мы назвали наше приложение «блог», поэтому нам пришлось включить «blog.apps.BlogConfig», чтобы основная программа Django знала, что эти приложения и пакеты являются частью нашего проекта Django.
  2. Чтобы наш API работал в продакшене, нам нужно позаботиться о Cross-Origin-Resource-Sharing (CORS). Чтобы это сработало, нам сначала нужно запустить pip install django-cors-headers, пакет, предназначенный для управления конфигурациями CORS для приложений Django.
  3. После установки django-cors-headers установите ‘corsheaders’ под массивом INSTALLED_APPS, как и раньше. Затем включите ‘corsheaders.middleware.CorsMiddleware’ в СРЕДНЕЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ как можно выше. Наконец, добавьте CORS_ORIGIN_ALLOW_ALL = True в самый конец settings.py. Мы разрешили Django разрешать CORS для всех доменов, но если вы хотите настроить разрешения таким образом, чтобы только определенные домены могли иметь доступ к API, обратитесь к этой документации.

Вау! Мы, наконец, закончили со всеми настройками, и осталось только создать модель и настроить конечные точки. Теперь, для целей этого руководства, предположим, что созданное нами приложение называется «блог», и теперь давайте перейдем к blog/models.py и включим следующее

from django.db import models

# Create your models here.
class Post(models.Model):
    title = models.TextField()
    content = models.TextField()

    def __str__(self):
        return self.title

Как и в Rails, в Django данные представлены в виде моделей. В нашем примере мы создали модель Post с двумя атрибутами, а именно title и content. И так же, как в Rails, для каждого атрибута нужно указывать его тип. В этом случае и заголовок, и контент являются текстовыми полями, и есть другие типы атрибутов модели Django по умолчанию, такие как CharField. Метод __str__ — это просто способ Python указать, что показывать, когда пользователь распечатывает наш объект, в этом случае мы хотим, чтобы каждый объект идентифицировался по его заголовку.

Теперь одной из моих любимых функций Django является панель администратора по умолчанию. Вместо того, чтобы сначала создавать конечные точки для данных GET или POST, панель администратора Django позволяет пользователям создавать, читать, обновлять или удалять данные (CRUD — действия бездействия) и выступать в качестве интуитивно понятного интерфейса для связи с базой данных.

Чтобы получить доступ к панели администратора для создания некоторых фиктивных данных, как мы вчера заполнили нашу базу данных в Rails, давайте сначала зарегистрируем нашу модель в панели администратора, чтобы позже мы могли манипулировать ею через интерфейс. Перейдите к файлу admin.py и включите следующее:

from django.contrib import admin

# Register your models here.
from .models import Post

admin.site.register(Post)

И так же, как и в Rails, при добавлении/модификации каждой модели нам нужно делать миграции и мигрировать их. Таким образом, запустите python manage.py makemigrations и python manage.py migrate. Затем нам нужно будет создать учетную запись администратора, чтобы войти в панель администратора. Давайте создадим его через python manage.py createsuperuser и просто следуем его инструкциям в терминале, чтобы создать учетную запись.

Теперь давайте запустим сервер разработки через python manage.py runserver и перейдем к http://localhost:8000/admin. Войдите в систему в соответствии с запросом, и вы должны увидеть следующий экран.

Внизу вы увидите, что наше приложение «блог» теперь отображается, а также отображается модель «публикация». Нажмите на него, и вы можете начать добавлять фиктивные данные как таковые.

Теперь, когда у нас есть некоторые фиктивные данные в нашей базе данных, последней частью головоломки является сериализация данных и создание конечной точки для вывода этих данных. Но что именно означает сериализация? Сериализация — это просто процесс преобразования объектов модели (данных) в данные JSON, которые могут использовать клиенты.

Теперь давайте создадим файл serializers.py в каталоге блога и включим в него следующее:

from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):

    class Meta:
        model = Post
        fields = ('title', 'content')

Давайте разберем этот код. Наш PostSerializer (на самом деле его можно назвать как угодно) расширяет класс сериализаторов django rest_framework.ModelSerializer, и нам нужно добавить некоторые метаданные, чтобы описать, какой контент мы сериализуем. Мы указываем, что данные, которые мы сериализуем, основаны на модели Post и что интересующие нас поля — это атрибуты title и content.

Перейдем к файлу blog/views.py и добавим следующее:

from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Post
from .serializers import PostSerializer

class PostList(APIView):
    def get(self, request):
        posts = Post.objects.all()
        serializer = PostSerializer(posts, many=True)
        return Response(serializer.data)

        
    def post(self):
        pass

Поначалу этот блок кода может показаться запутанным, но давайте разберем его вместе. Во-первых, мы импортируем серию пакетов, а затем создаем представление. В отличие от большинства фреймворков MVC, таких как Rails, уровень представления Django относится к контроллеру в традиционных структурах MVC. Все о споре и решении можно прочитать здесь. Слой View в Django контролирует, какие данные извлекаются и возвращаются, и поскольку мы заинтересованы только в создании API только для GET ради этого простого руководства, мы заполняем метод только для get(self, request). Итак, мы сначала извлекаем все объекты Post через Post.objects.all(), а затем сериализуем их с помощью сериализатора, который мы создали ранее, передавая список данных, а также спецификацию many=True, чтобы указать, что мы предоставляем ему несколько данных, чтобы он должен вернуть нас со списком. Наконец возвращаем данные.

Заключительной частью этого является создание маршрута. Итак, перейдите в главный каталог проекта, откройте его файл settings.py и добавьте следующее:

from django.conf.urls import url
from django.contrib import admin
from rest_framework.urlpatterns import format_suffix_patterns
from blog import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^posts/', views.PostList.as_view()),
]

urlpatterns = format_suffix_patterns(urlpatterns)

Это должно лишь немного отличаться от предоставленных URL-шаблонов по умолчанию. Сначала мы импортируем format_suffix_patterns, чтобы наши конечные точки были RESTFUL. Затем мы создаем маршрут posts/, который, как мы указываем, возвращает сериализованные данные представлений блог-приложения.

Теперь все готово, и все, что нам нужно сделать, это снова запустить сервер с python manage.py runserver и нажать http://localhost:8000/posts, и мы должны увидеть следующие данные JSON.

Поздравляем с завершением этого урока и надеемся, что он вам понравился. Django очень прост в освоении для начинающих, и я настоятельно рекомендую этот учебник, если вы новичок в веб-разработке и программировании в целом. Python — относительно простой в освоении язык, а Django имеет несколько простых интерфейсов для взаимодействия. Завтра мы изучим еще один фреймворк на Python — Flask. Быть в курсе!